哪位高手看一下如何用C语言解决这个问题

llf_hust 2005-09-15 10:33:46
要求用户输入4个坐标,判断前3个坐标是否可以作为三角形的3个顶点;如果能,同时判断第四个坐标是否在这个三角形内 (不包括在边上和顶点上)
最好用C语言编程实现
...全文
521 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bobby136 2005-09-16
  • 打赏
  • 举报
回复
点为什么是2维的?为什么是int类型?
用3维向量做
typedef float Point[3];
oyf888 2005-09-16
  • 打赏
  • 举报
回复
楼上的楼上一定错误,如果点离三角型比较远,是怎么都大于的。小于也是不行的,比如说在菒边中线外一点,一定也小于3个边的和。

还有张真人的水平画线法也不 一定就管用,如果最后一点在三角的很上方或者下方就不灵了。
Kvci 2005-09-16
  • 打赏
  • 举报
回复
楼上错误
zhxk 2005-09-16
  • 打赏
  • 举报
回复
1)略
2)第四点到三角形三个顶点的和是否小于三角形三边和

zhxk 2005-09-16
  • 打赏
  • 举报
回复
1)略
2)第四点到三角形三个顶点的和是否小于三边和

xl5338870 2005-09-16
  • 打赏
  • 举报
回复
看了一下,foochow的这句if((s3.y-s1.y)*(s2.x-s1.x)==(s3.x-s1.x)*(s2.y-s1.y))

是不是应该改成:
a = (s3.y-s1.y)*(s2.x-s1.x);
b = (s3.x-s1.x)*(s2.y-s1.y);
if (a == b) || (a+b == 0) { // 共线, 2次乘法,4次减法
}
Kvci 2005-09-16
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/4273/4273196.xml?temp=.2160913
shining 2005-09-16
  • 打赏
  • 举报
回复
我没时间帮你写程序,只提供思想:
1)判断三个坐标能否作为三角形的顶点
只要这三个点不共线就可以形成一个三角形。
2)判断一点是否在三角形内(此方法可适用任意多边形)
首先排除该点在三角形边上的可能,然后从此点水平向左或向右画一条射线,看此射线与三角形的交点个数,如个数是奇数,说明点在三角形内,如个数是偶数,说明点在三角形外。

大体思想就是上面说述,但用程序实现起来恐怕不是太容易,我因为工作没空帮你写,你就自己写吧,这很能锻炼编程能力的。

多多动手吧!
XINYONGHUCSDN 2005-09-15
  • 打赏
  • 举报
回复
算法:1,判断是否组成三角形:三点是否在一条直线上
2,判断第四个点(假设为M)是否在三角形ABC之内:若点在三角形之内,则这个点(M)与三角形的任一顶点(假设为A)同在该顶点对边(BC)的同侧。

不用算面积或者cos, sin等值,应该没问题。
简单测试了一下。


#include <stdio.h>

int fun(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
{
if((x3-x1)*(y2-y1) == (y3-y1)*(x2-x1)) return -1;
if(((x4-x1)*(y2-y1)-(y4-y1)*(x2-x1))*((x3-x1)*(y2-y1)-(y3-y1)*(x2-x1)) <= 0) return -2;
if(((x4-x1)*(y3-y1)-(y4-y1)*(x3-x1))*((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1)) <= 0) return -2;
if(((x4-x2)*(y3-y2)-(y4-y2)*(x3-x2))*((x1-x2)*(y3-y2)-(y1-y2)*(x3-x2)) <= 0) return -2;
return 0;
}

int main()
{
int result;
result = fun(0, 1, 2, 3, 4, 2, 4, 3);
if(result == -1) printf("the first 3 points can not generate a triangle\n");
else if(result == -2) printf("the 4th point is not in the triangle which generated by the first 3 points\n");
else printf("the 4th point is in the triangle which generated by the first 3 points\n");
return 0;
}
foochow 2005-09-15
  • 打赏
  • 举报
回复
//看看这个,不知道有错没...
#include<iostream>
#include<cmath>
using namespace std;
class iter
{
public:
int x;
int y;
};
double fun(iter&a,iter&b,iter&c)
{
return abs((a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x))*0.5;
}
int main()
{
iter s1,s2,s3,s4;
cin>>s1.x>>s1.y;
cin>>s2.x>>s2.y;
cin>>s3.x>>s3.y;
cin>>s4.x>>s4.y;
if((s3.y-s1.y)*(s2.x-s1.x)==(s3.x-s1.x)*(s2.y-s1.y))
{
cout<<"s1,s2,s3在一条直线上"<<endl;
return 0;
}
if(fun(s1,s2,s3)==fun(s1,s2,s4)+fun(s1,s3,s4)+fun(s2,s3,s4))
{
cout<<"s4位于s1,s2s,s3组成的三角行内"<<endl;
}
else cout<<"s4不位于s1,s2s,s3组成的三角行内"<<endl;
return 0;
}
llf_hust 2005-09-15
  • 打赏
  • 举报
回复
up
xiaocai0001 2005-09-15
  • 打赏
  • 举报
回复
顶一个,要不 道长没法再发了~~
zhouhuahai 2005-09-15
  • 打赏
  • 举报
回复
晕倒, 注意:C2是指C的平方
zhouhuahai 2005-09-15
  • 打赏
  • 举报
回复
△ABC的三边a,b,c具有c2=a2+b2-2abcosC
用这个就可以求角的大小了.不熟得cosC,再反正弦即可得到角的大小了.

中的不熟得 改成: 得到了cosC
zhouhuahai 2005-09-15
  • 打赏
  • 举报
回复
余弦定理:
△ABC的三边a,b,c具有c2=a2+b2-2abcosC
用这个就可以求角的大小了.不熟得cosC,再反正弦即可得到角的大小了.

两点的距离公式:(A B两点)
sqrt( (A.x - B.x) * (A.x - B.x) + (A.y - B.y)*(A.y - B.y) )
llf_hust 2005-09-15
  • 打赏
  • 举报
回复
数学知识早忘记了,哪 位高手帮忙写一下呀
xiaocai0001 2005-09-15
  • 打赏
  • 举报
回复
我想,三个点是否在同一直线上的判断是比较好计算了吧
foochow 2005-09-15
  • 打赏
  • 举报
回复
呵呵,同意xiaocai0001
xiaocai0001 2005-09-15
  • 打赏
  • 举报
回复
判断三个点是否能构成三角形

只要排除这三个点是否重合或在一条直线上就可以了吧.
zhouhuahai 2005-09-15
  • 打赏
  • 举报
回复
不就是一些公式的使用么?
加载更多回复(4)

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧