迷宫求解c语言程序里一个点在是否三角形区域内如...

C语言中,根据用户输入的三个顶点坐标计算三角形的面积。急求:点的坐标如何表示?!_百度知道
C语言中,根据用户输入的三个顶点坐标计算三角形的面积。急求:点的坐标如何表示?!
提问者采纳
楼上的说了,外层控制顶点次序结构体可以。如果没学结构体可以用二维数组。通过两层for循环进行数据输入。并且可以用printf输出语句提示该输入第几个顶点了,内层控制每个顶点的横左边和纵坐标。第一维是第一个顶点第二个顶点第三个顶点,float a[3][2]
我大一,C语言才学,结构体好深奥啊还没学到,有没有简单点的
老师布置的题呀,如果是这样的话应该是刚上大一一个月,数组应该也没有学到吧?那你就用普通变量吧。float ax,ay,bx,by,cx,cy,s;这个好理解吧。然后通过scanf(&%d%d%d%d%d%d&,&ax,&ay,&bx,&by,&cx,&cy);输入。(或者for循环进行输入更简洁一些,for应该学了吧)通过勾股定理求变长,再用海伦公式求面积。不明白的继续追问。
提问者评价
其他类似问题
为您推荐:
其他6条回答
printf(&quot#include &lt.y)+(p3.x;;&#47:&2 a= abs((p2.y-p3,&p2.y))/2, p3.y); printf(&quot:& scanf(&quot.x*p3;getch();void main(void){ point p1.x,y,&p3, p2,&p3;struct point{/input third point.h&%f %f&),&p1;}.y-p2.y)+(p1.x*p1:& scanf(& float a.x*p3;6.y-p1; scanf(&#include &lt.x;&#47. Area = abs((xB*yA-xA*yB)+(xC*yB-xB*yC)+(xA*yC-xC*yA))/ printf(&),&p1;);/%f %f&%f %f&quot.h&gt.x*p2;;#include &lt,a);input second point.x*p2;printf(&input first point.x*p1.h&.y);area=%f&.y),&p2
#include&stdio.h&#include&math.h&float d(float x[],float y[]){
return sqrt(pow(x[0]-y[0],2)+pow(x[1]-y[1],2));}int main(){
float a,b,c,p;
float x[2],y[2],z[2];
printf(&输入三点坐标:\n&);
scanf(&%f%f%f%f%f%f&,x,x+1,y,y+1,z,z+1);
p=0.5*(a+b+c);
printf(&三角形面积:%g&,sqrt(p*(p-a)*(p-b)*(p-c)));
return 0;}
这个你用随意方法存下六个数字,自己知道是坐标就行了,然后算出三条边长(连点距离你应该是会的吧),用海伦公式【S=sqrt(q*(q-a)*(q-b)*(q-c))】求三角形面积就OK了。q是周长一半
public struct point{}这样不知道行不
使用形如float triangle_addr[2][3]记录三角形3顶点坐标,然后用海伦公式求三角形面积。p=1/2(a+b+c),S=二次根号下((p-a)*(p-b)*(p-c))。当然还要考虑到用户输入的坐标能否构成三角形。
#include &iostream&struct Point
//三角形顶点结构体{ //x坐标 //y坐标};int main(){
Point A, B, C;
cin && A.x && A.y;
cin && B.x && B.y;
cin && C.x && C.y;cout && &A点坐标: (& && A.x && &,& && A.y && &)& &&
cout && &B点坐标: (& && B.x && &,& && B.y && &)& &&
cout && &C点坐标: (& && C.x && &,& && C.y && &)& &&return 0;}
顶点坐标的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁C语言中,根据用户输入的三个顶点坐标计算三角形的面积.点的坐标如何表示?_百度作业帮
C语言中,根据用户输入的三个顶点坐标计算三角形的面积.点的坐标如何表示?
结构体可以,楼上的说了.如果没学结构体可以用二维数组,float a[3][2].第一维是第一个顶点第二个顶点第三个顶点.通过两层for循环进行数据输入,外层控制顶点次序,内层控制每个顶点的横左边和纵坐标.并且可以用printf输出语句提示该输入第几个顶点了.
我大一,C语言才学,结构体好深奥啊还没学到,有没有简单点的
老师布置的题呀,如果是这样的话应该是刚上大一一个月,数组应该也没有学到吧?
那你就用普通变量吧。
float ax,ay,bx,by,cx,cy,s;
这个好理解吧。
然后通过scanf("%d%d%d%d%d%d",&ax,&ay,&bx,&by,&cx,&cy);输入。
(或者for循环进行输入更简洁一些,for应该学了吧)
通过勾股定理求变长,再用海伦公式求面积。
不明白的继续追问。
其他类似问题
扫描下载二维码C语言判断点面位置关系系统_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C语言判断点面位置关系系统
上传于||文档简介
&&C​语​言​判​断​点​面​位​置​关​系
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩8页未读,继续阅读
你可能喜欢C语言实验-带答案 2_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C语言实验-带答案 2
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
下载文档到电脑,查找使用更方便
还剩36页未读,继续阅读
你可能喜欢判断一个点是否在指定三角形内(1)
问题:判断点P是否在三角形ABC内
判断一个点是否在在三角形内,最常用的两种方法:面积法、向量同向法。算法虽然很简单,但要做到高效却不容易,要考虑到二维、三维的区别,还要考虑到坐标是用浮点数还是用整数来表示。
在二维平面上,问题相对简单,一般只需6次乘法计算。但在三维平面时问题要复杂很多,在网上看到的算法,一般都需要30次乘法计算(如果已知点P在平面ABC上,则需21次)。实际上,在三维坐标系下,可以做到增加1次比较,将乘法计算降到13次(如果点P在平面ABC上,则最多只要8次乘法计算)。
最常用的两种方法:面积法和向量同向法本质上是等价的。
向量同向法:若点P在三角形内,则三个向量:ab × ap、ap × ac、pb × pc平行同向(它们也与向量ab × ac平行同向),由于这三个向量均有可能为0,直接判断它们平行同向相当麻烦,但考虑到ab × ac不可能为0,直接判断“向量:ab × ap、ap × ac、pb × pc均与ab × ac平行同向”反而更简单。
面积法:当点p在三角形abc内时,4个三角形的面积满足: abc = abp + apc + pbc
对面积的计算,可以通过向量的向量积计算得到: 面积 abc = |ab × ac| / 2
表面上,要计算4个三角形的面积,但根据下面的公式:
&&&&&&&&&& ap × ap = 0, pb × pc = (ab - ap) × (ac - ap) = ab × ac - ab × ap - ap × ac
可以少算一次矢量积。
公式: |ab × ac| = |ab × ap| + |ap × ac| + |(ab × ac - ab × ap - ap × ac)|
对任意向量a、b、c:&& |a + b + c| = |a| + |b| + |c| &==& 向量a、b、c 平行同向
&& 因而,面积法和向量同向法本质上是等价的。
下面先讨论二维坐标系(每个点X,都看作是原点O到该点X的二维向量OX)。
先定义一个二维向量模板:
template&typename T& class Vec2 {
&typedef T value_
&Vec2(T xx = 0, T yy = 0) : x(xx), y(yy) {};
&T cross(const Vec2& v) const { return x * v.y - y * v.x;} // 矢量积
&Vec2 operator-(const Vec2& v) const { return Vec2(x - v.x, y - v.y); }
如果坐标采用浮点数,考虑到浮点数取绝对值方便(有专门的浮点指令),但彼此间比较大小存在误差,采用面积法比较方便:
typedef Vec2&double& Vd2;
bool is_in_triangle(const Vd2& a, const Vd2& b, const Vd2& c, const Vd2& p)
&Vd2 ab(b -a), ac(c - a), ap(p - a);
&//用矢量积计算面积,下面4个值的绝对值,是对应的三角形的面积的两倍,
&double abc = ab.cross(ac);
&double abp = ab.cross(ap);
&double apc = ap.cross(ac);
&double pbc = abc - abp -&& //等于pb.cross(pc)
&//面积法:4个三角形的面积差 等于 0
&double delta = fabs(abc) - fabs(abp) - fabs(apc) - fabs(pbc);
&return fabs(delta) & DBL_EPSILON;&&&&&&&&
如果坐标采用整数表示,代码相对麻烦点:
typedef Vec2&int& Vi2;
bool is_in_triangle(const Vi2& a, const Vi2& b, const Vi2& c, const Vi2& p)
&Vi2 ab(b -a), ac(c - a), ap(p - a);
&//用矢量积计算面积,下面4个值的绝对值,是对应的三角形的面积的两倍,
&int abc = ab.cross(ac);
&int abp = ab.cross(ap);
&int apc = ap.cross(ac);
&int pbc = abc - abp -&& //等于pb.cross(pc)
&//方法1: 面积法:4个三角形的面积差 等于 0
&return abs(abc) == abs(abp) + abs(apc) + abs(pbc)
&//方法2: 矢量同向法: abp apc pbc 均与 abc 同向:
&if (abc & 0) { abp = - apc = - pbc = - }
&return (abp &= 0) & (apc &= 0) & (pbc &= 0);
方法1:要计算4次绝对值,看似需要4次条件跳转,但主流的编译器,都能采用位运算直接计算绝对值(注意:GCC需要加额外的参数),不需要任何条件跳转。
方法2:比方法1指令少,但多1次条件跳转。
哪种方法效率较高,与编译器生成的具体代码有关。
上面代码中,可采用的两种优化方法:
① 对整数x取绝对值,可以利用位运算:
&&& 设 y = 0 (当x &= 0)
&&&&&&&& = -1 (当x & 0)
&(编译器可以利用cdq或sar等指令直接由x计算出y值)
&则 abs(x)& =& (x xor y) C y
&&&&& 或:&& = (x + y) xor y
&&&&& 或:&& = x C (2 * x & y)
&② 对整数a、b、c, a &= 0 && b &= 0 && c &= 0 等价于
(a &= 0) & (b &= 0) & (c &= 0) 等价于:
(a | b | c) &= 0
&为避免编译器没有进行相关优化,直接手动优化,可得:
inline int chg_sign(int x, int sign) //sign只能取0或-1,函数分别返回x、-x
&return (x + sign) ^
&//return (x ^ sign) -
bool is_in_triangle(const Vi2& a, const Vi2& b, const Vi2& c, const Vi2& p)
&Vi2 ab(b -a), ac(c - a), ap(p - a);
&//用矢量积计算面积,下面4个值的绝对值,是对应的三角形的面积的两倍,
&int abc = ab.cross(ac);
&int abp = ab.cross(ap);
&int apc = ap.cross(ac);
&int pbc = abc - abp -&& //等于pb.cross(pc)
&//方法3: 矢量同向法(优化版)
&const int sign = (abc &= 0) - 1;
&//const int sign = abc && (sizeof(abc) * CHAR_BIT - 1);
&return (chg_sign(abp, sign) | chg_sign(apc, sign) | chg_sign(pbc, sign)) &= 0;

我要回帖

更多关于 迷宫求解c语言程序 的文章

 

随机推荐