c语言判断点
1. 帮我编一个判断点在三角形内的c语言程序
如果不用向量的方法,可以用凸多边形理论求解。
设三角形的三顶点为A、B、C,现有点P(点P不是点A、B、C),过A、P两点作直线交BC所在直线于点D,若点D位于线段BC上,则点P一定位于该三角形内。代码如下:
#include<stdio.h>
#include"math.h"
#defineDBL_MIN2.2250738585072014e-308
structPoint{/*(x,y)*/
doublex;
doubley;
};
structLine{/*a*x+b*y=c*/
doublea;
doubleb;
doublec;
};
structTriangle{
structPointA;
structPointB;
structPointC;
};
structLinecreateLine(structPointp1,structPointp2){
structLineline;
line.a=p1.y-p2.y;
line.b=p2.x-p1.x;
line.c=p1.x*(p1.y-p2.y)+p1.y*(p2.x-p1.x);
returnline;
}
intisInTriangle(structTriangle*tri,structPoint*P){
/*P落在三角形顶点上*/
if(((fabs(P->x-tri->A.x)<DBL_MIN&&fabs(P->y-tri->A.y)<DBL_MIN))
||((fabs(P->x-tri->B.x)<DBL_MIN&&fabs(P->y-tri->B.y)<DBL_MIN))
||((fabs(P->x-tri->C.x)<DBL_MIN&&fabs(P->y-tri->C.y)<DBL_MIN)))
return1;
structLineline1=createLine(tri->A,*P);
structLineline2=createLine(tri->B,tri->C);
structPointD;
if(fabs(line1.a*line2.b-line2.a*line1.b)>=DBL_MIN){/*不平行或不重合*/
D.x=(line2.b*line1.c-line1.b*line2.c)/(line1.a*line2.b-line2.a*line1.b);
D.y=(line1.a*line2.c-line2.a*line1.c)/(line1.a*line2.b-line2.a*line1.b);
if(((tri->B.x<=D.x&&D.x<=tri->C.x)||(tri->C.x<=D.x&&D.x<=tri->B.x))
&&((tri->B.y<=D.y&&D.y<=tri->C.y)||(tri->C.y<=D.y&&D.y<=tri->B.y)))
return1;
}
return0;
}
intisTriangle(structTriangletri){
doubleAB,BC,AC;
AB=sqrt((tri.A.x-tri.B.x)*(tri.A.x-tri.B.x)+(tri.A.y-tri.B.y)*(tri.A.y-tri.B.y));
BC=sqrt((tri.C.x-tri.B.x)*(tri.C.x-tri.B.x)+(tri.C.y-tri.B.y)*(tri.C.y-tri.B.y));
AC=sqrt((tri.A.x-tri.C.x)*(tri.A.x-tri.C.x)+(tri.A.y-tri.C.y)*(tri.A.y-tri.C.y));
if(AB+BC>AC&&BC+AC>AB&&AC+AB>BC)
return1;
else
return0;
}
intmain(intargc,char**argv){
structTriangletriangle={{-2,0},{2,3},{2,0}};//三角形
structPointpoints[]={{-1.999,0.0001},{0,0},{1,1},{2,3},{-1,2}};//测试点数组
if(isTriangle(triangle)){
inti;
for(i=0;i<5;i++){
if(isInTriangle(&triangle,&points[i]))
printf("点(%f,%f)在三角形内。 ",points[i].x,points[i].y);
else
printf("点(%f,%f)不在三角形内。 ",points[i].x,points[i].y);
}
}else
printf("不构成三角形! ");
return0;
}
运行结果:
2. C语言关于判断点在圆上。
float a,b;
scanf("%f,%f",&a,&b); //获取点坐标
if(abs(a*a+b*b-1)<0.001){
printf("点在圆上");
}
else{
printf("点不在圆上");
}
3. C语言里面的判断语句
在C语言中,判断语句的一般格式为
if(expr1)
{
//somecodes
}
elseif(expr2)
{
//somecodes
}
elseif(expr3)
...
else
{
//somecodes
}
//outofcheck
执行时,会依照书写顺序,依次判断各个expr,如果有一个为真,则执行后续的{}内语句,并不再执行后续判断,而是直接从out of check开始执行。
else if的数量不限,可以不存在,也可以有任意多组。
else同样可以不存在。
每个else 与最其之前最近的没有匹配else的if相结合。
判断执行的语句{}部分,大括号对可以省略,省略后,if仅对其下一语句生效。
4. C语言判断点是否在三角形内或外
#include<stdio.h>
#include<math.h>
struct point
{
double x;
double y;
};
int area(float m,float n,float t)
{
float p,S;
p=(m+n+t)/2;
S=sqrt(p*(p-m)*(p-n)*(p-t));
return S;
}
void main()
{
struct point a,b,c,d,p;
float AB,BC,AC;
float S0,S1,S2,S3;
float DA,DB,DC;
scanf("%lf,%lf\n",&a.x,&a.y);
scanf("%lf,%lf\n",&b.x,&b.y);
scanf("%lf,%lf\n",&c.x,&c.y);
AB=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
BC=sqrt((b.x-c.x)*(b.x-c.x)+(b.y-c.y)*(b.y-c.y));
AC=sqrt((a.x-c.x)*(a.x-c.x)+(a.y-c.y)*(a.y-c.y));
if((AB+BC)>AC && (AB+AC)>BC && (AC+BC)>AB){
printf("请输入D点坐标:\n");
scanf("%lf,%lf\n",&d.x,&d.y);
DA=sqrt((d.x-a.x)*(d.x-a.x)+(d.y-a.y)+(d.y-a.y));
DB=sqrt((d.x-b.x)*(d.x-b.x)+(d.y-b.y)+(d.y-b.y));
DC=sqrt((d.x-c.x)*(d.x-c.x)+(d.y-c.y)+(d.y-c.y));
S0=area(AB,BC,AC);
S1=area(DA,DB,AB);
S2=area(DA,DC,AC);
S3=area(DB,DC,BC);
if(S1+S2+S3-S0==0)
printf("点D位于三角形内部\n");
else
printf("点D位于三角形外部\n");
}
else
printf("不能构成三角形!");
}
//看看这样可比可以。你这个题还有更简单的方法,试试把每个边当成直线段,然后用d点带入和0比较大小,就会很简单。
5. c语言编一个程序判断一个点是否在单位圆上,需要以小数点后三位为精度进行判断。
#include<stdio.h>
main()
{
floatx,y,x1,y1;//定义变量
while(1){//无限循环,多次输入输出
scanf("%f%f",&x1,&y1);//输入坐标
x=(float)((int)(x1*1000+0.5))/1000;//四舍五入取小数点后3位
y=(float)((int)(y1*1000+0.5))/1000;
if(x*x+y*y==1)//坐标判断
printf("坐标(%.3f,%.3f)在单位圆上!
",x,y);
else
printf("坐标(%.3f,%.3f)不在单位圆上!
",x,y);
}
}
如图所示,望采纳。。。。。。
6. c语言 判断三个点是不是在一条直线上 在线等 点自定
#include"stdafx.h"
#include<stdio.h>
#include<math.h>
intmain()
{
floatx1,x2,x3,y1,y2,y3;
scanf("(%f,%f) ",&x1,&y1);
scanf("(%f,%f) ",&x2,&y2);
scanf("(%f,%f)",&x3,&y3);
if((y1-y2)/(x1-x2)==(y2-y3)/(x2-x3))
printf("在同一直线上。 ");
elseprintf("不在同一直线上。 ");
return0;
}
举例:输入
(1,2)
(2,4)
(4,8)
7. C语言如何编判断点是否在圆上
//输入某个点A的平面坐标(x,y),判断(输出)A点是在圆内、圆外、还是在圆上,
//设这个圆的圆心是(a,b),半径为r。
#include <stdio.h>
main()
{ int x,y;
scanf("%d %d",x,y);
//如果点A(x,y)在圆内,则(x-a)*(x-a)+(y-b)*(y-b)<r
//如果点A(x,y)在圆上,则(x-a)*(x-a)+(y-b)*(y-b)=r
//如果点A(x,y)在圆外,则(x-a)*(x-a)+(y-b)*(y-b)>r
if(x-a)*(x-a)+(y-b)*(y-b)<r)
printf("点A在圆内");
else if(x-a)*(x-a)+(y-b)*(y-b)=r)
printf("点A在圆上");
elst if(x-a)*(x-a)+(y-b)*(y-b)>r)
printf("点A在圆外");
}
8. 怎么编一个判断点在三角形内的C语言程序
以下代码定义了三个函数:
point:定义点的位置,
area:定义三角形的大小
main:主程序,通过调用point,area函数判断点是否在三角形内
#include<stdio.h>
#include<math.h>
structpoint
{
doublex;
doubley;
};
intarea(floatm,floatn,floatt)
{
floatp,S;
p=(m+n+t)/2;
S=sqrt(p*(p-m)*(p-n)*(p-t));
returnS;
}
voidmain()
{
structpointa,b,c,d,p;
floatAB,BC,AC;
floatS0,S1,S2,S3;
floatDA,DB,DC;
scanf("%lf,%lf ",&a.x,&a.y);
scanf("%lf,%lf ",&b.x,&b.y);
scanf("%lf,%lf ",&c.x,&c.y);
AB=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
BC=sqrt((b.x-c.x)*(b.x-c.x)+(b.y-c.y)*(b.y-c.y));
AC=sqrt((a.x-c.x)*(a.x-c.x)+(a.y-c.y)*(a.y-c.y));
if((AB+BC)>AC&&(AB+AC)>BC&&(AC+BC)>AB){
printf("请输入D点坐标: ");
scanf("%lf,%lf ",&d.x,&d.y);
DA=sqrt((d.x-a.x)*(d.x-a.x)+(d.y-a.y)+(d.y-a.y));
DB=sqrt((d.x-b.x)*(d.x-b.x)+(d.y-b.y)+(d.y-b.y));
DC=sqrt((d.x-c.x)*(d.x-c.x)+(d.y-c.y)+(d.y-c.y));
S0=area(AB,BC,AC);
S1=area(DA,DB,AB);
S2=area(DA,DC,AC);
S3=area(DB,DC,BC);
if(S1+S2+S3-S0==0)
printf("点D位于三角形内部 ");
else
printf("点D位于三角形外部 ");
}
else
printf("不能构成三角形!");
}
9. C语言 判断点在第几象限