#include<stdio.h>
#include<math.h>
void cal(x1,x2,x3,x4,y1,y2,y3,y4)
int x1=1, x2=2, x3=3, y1=4, y2=5, y3=6, x4,y4;
double ang1,ang2,ang3,ang4;
{
double a,b,c;
a=(y1-y2)/(x1-x2);
ang1=atan(a);
b=(y3-y2)/(x3-x2);
ang2=atan(b);
ang3=fabs(ang1-ang2);
c=(y4-y2)/(x4-x2);
ang4=atan(c);
}
int judge(ang3,ang4);
double ang3,ang4;
{if
ang3(fabs(ang4))
return(1);
else
return(0);
}
main()
{int x1=1,x2=2,x3=3,y1=4,y2=5,y3=6,x4,y4;
double ang1,ang2,ang3,ang4;
int judge();
void cal();
printf("enter number:");
scanf("%d%d",&x4,&y4);
if (judge(ang3,ang4))
printf("the point is outside!");
else
printf("the point is inside!");
return(0);
}
----------------解决方案--------------------------------------------------------
本人不是高手,只是路过,有机会一起研究
----------------解决方案--------------------------------------------------------
给点注释~
----------------解决方案--------------------------------------------------------
看不太懂,关注中……,希望高手能给点指点
----------------解决方案--------------------------------------------------------
加点注释把! 不知道你思路! //程序如下: //问题多多,但我不会改,各位高手,帮帮小女子吧, //程序是:先用已知的三点确定一个类似三角形的区域, //在给出一个点,判断此点是否再次区域中 //,这里我用的是比较角度得到大小来判断的, //希望高人可以指点,如有好的方法就更不胜感激了!!!
#include<stdio.h> #include<math.h> void cal(int x1,int x2,int x3,int x4,int y1,int y2,int y3,int y4) { //int x1=1, x2=2, x3=3, y1=4, y2=5, y3=6, x4,y4; double ang1,ang2,ang3,ang4; //{ double a,b,c; a=(y1-y2)/(x1-x2); ang1=atan(a); b=(y3-y2)/(x3-x2); ang2=atan(b); ang3=fabs(ang1-ang2); c=(y4-y2)/(x4-x2); ang4=atan(c); } int judge(double ang3,double ang4) //double ang3,ang4; { if (ang3==(fabs(ang4))) return(1); else return(0); } main() {int x1=1,x2=2,x3=3,y1=4,y2=5,y3=6,x4,y4; double ang1,ang2,ang3,ang4; ///int judge(); //void cal(); printf("enter number:"); scanf("%d%d",&x4,&y4); if (judge(ang3,ang4)) printf("the point is outside!"); else printf("the point is inside!"); return(0); } 没语法错误 但结果不对!
----------------解决方案--------------------------------------------------------
贴上我的想法,不知到是不是正确。。。 #include <stdio.h> #include <math.h> #include <conio.h>
#define EPSILON 1e-24
typedef unsigned char BOOL;
/* 三角形区域结构 */ typedef struct triArea { /* 向量AB */ double vAB[2]; /* 向量AC */ double vAC[2]; /* 向量BC */ double vBC[2]; /* 向量AB和向量AC的夹角 */ double angleAB_AC; /* 向量AB和向量BC的夹角 */ double angleAB_BC; /* 向量BC和向量AC的夹角 */ double angleBC_AC; };
/* 取两数中最大值 */ double max(double,double); /* 趋近比较 */ BOOL approx_equal(double,double); /* 通过平面两座标计算向量坐标 */ void convert(double [],double [],double []); /* 计算两向量的点积 */ double valmuti(double [],double []); /* 计算一个向量的模 */ double mod(double []); /* 计算两向量夹角的cos值 */ double vector_cos(double [],double []);
int main() { /* 定义一个测试点 */ double posD[2]; /* 定义构成三角形平面的三个顶点 */ double posA[2]={1,4},posB[2]={2,5},posC[2]={3,6}; /* 定义测试点与三角区域个顶点的夹角和与顶点的连线向量 */ double vAD[2],vBD[2],vCD[2]; double angleAD_AB,angleAD_AC,angleBD_AB,angleBD_BC,angleCD_AC,angleCD_BC; /* 定义一个三角形区域 */ triArea region; /* 计算三角形区域的边界向量 */ convert(posA,posB,region.vAB); convert(posA,posC,region.vAC); convert(posB,posC,region.vBC); /* 计算三角形区域的三个顶角的度数 */ region.angleAB_AC=acos(vector_cos(region.vAB,region.vAC)); region.angleAB_BC=acos(vector_cos(region.vAB,region.vBC)); region.angleBC_AC=acos(vector_cos(region.vBC,region.vAC)); double triAB,triAC,triBC; printf("Input a position (x,y)="); scanf("%lf,%lf",&posD[0],&posD[1]); /* 计算测试点与三角形区域三个顶点构成的向量 */ convert(posA,posD,vAD); convert(posB,posD,vBD); convert(posC,posD,vCD); /* 计算测试点与各个顶点的夹角 */ angleAD_AB=acos(vector_cos(region.vAB,vAD)); angleAD_AC=acos(vector_cos(region.vAC,vAD)); angleBD_AB=acos(vector_cos(region.vAB,vBD)); angleBD_BC=acos(vector_cos(region.vBC,vBD)); angleCD_AC=acos(vector_cos(region.vAC,vCD)); angleCD_BC=acos(vector_cos(region.vBC,vCD)); /* 趋近比较 */ if(approx_equal(angleAD_AB+angleAD_AC,region.angleAB_AC)&& approx_equal(angleBD_AB+angleBD_BC,region.angleAB_BC)&& approx_equal(angleCD_AC+angleCD_BC,region.angleBC_AC)) { printf("Position (%lf,%lf) is in the triangle region!\n",posD[0],posD[1]); } else { printf("Position (%lf,%lf) is not in the triangle region!\n",posD[0],posD[1]); } getch(); return 1; }
double max(double a,double b) { return a>b?a:b; }
BOOL approx_equal(double a,double b) { if(!a&&b) return fabs(b)<=EPSILON; if(a&&!b) return fabs(a)<=EPSILON; return (fabs(a-b)/max(fabs(a),fabs(b)))<=EPSILON; }
void convert(double bpos[],double epos[],double v[]) { register int i; for(i=0;i<2;v[i]=epos[i]-bpos[i],i++); }
double valmuti(double v1[],double v2[]) { register int i; double result=0; for(i=0;i<2;result+=v1[i]*v2[i],i++); }
double mod(double v[]) { register int i; double result=0; for(i=0;i<2;result+=pow(v[i++],2)); return sqrt(result); }
double vector_cos(double v1[],double v2[]) { return valmuti(v1,v2)/(mod(v1)*mod(v2)); }
----------------解决方案--------------------------------------------------------
中午由于要去吃饭和上课,所以匆匆忙忙的把代码贴,没来得及解释,现在补上
大家请看图,已知二维平面中坐标以知的三点A,B,C,另有一点D,欲判断D受否在该三角形区域内。。
首先我先把构成三角形区域的三个向量AB,BC,AC向量计算出来,并依次求出它们两两所夹的角。然后将点D分别和三个顶点相连构成三条新的向量AD,BD,CD,我的思路便是分别判断AB与AD,AC与AD的夹角的和是否等于AB与AC的夹角,同理AB与BD,BD与CD的夹角和是否等于AB与BC的夹角,CD与CB,CD与AC的夹角和是否等于BC和AC的夹角,如果上述三个条件都满足,则认为D点在该三角形区域内。。。
不知道我的看法是不是正确,希望高手能够给出更精确的解释。。。
----------------解决方案--------------------------------------------------------
我狂晕,这难!!!!
----------------解决方案--------------------------------------------------------
谢谢各位了,非常感谢,希望大家继续关注!!!
----------------解决方案--------------------------------------------------------