一道无敌编程题求助……………………………………

z940417 2008-11-16 05:02:26
就是在一个坐标系上输入3个点,然后判断坐标(0,0)在不在这3个点组成的三角形里……用c++实现~~我郁闷想不了……
...全文
158 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jieao111 2008-11-16
  • 打赏
  • 举报
回复
看来数学没学好
zbihong 2008-11-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fengxuxing 的回复:]
这是数学知识,我测试了一下,这个矩阵计算的验证方法无法测试边界值的情况,但是非常符合你的在三角里的条件。以下设置的数据就是不能被测试的在边上的点的情况,但是将a,b数据调换,结果又是对的,这说明,原点在边界上时的情况结果判断是不确定的。
http://www.mathchina.com/cgi-bin/topic.cgi?forum=5&topic=4595

C/C++ code
#include <stdio.h>

typedef struct _Point
{
double x;
double y;
}Poin…
[/Quote]
简单,实用!!!
herman~~ 2008-11-16
  • 打赏
  • 举报
回复
mark
fallening 2008-11-16
  • 打赏
  • 举报
回复
#ifndef _TRIANGLE_H_INCLUDED
#define _TRIANGLE_H_INCLUDED

#include <cmath>

template< typename T >
struct Point
{
T x_;
T y_;

Point<T>& operator = ( const Point<T>& other )
{
x_ = other.x_;
y_ = other.y_;
return *this;
}
};

template< typename T >
T distance( const Point<T>& p1, const Point<T>& p2 )
{
long double dx = p1.x_ - p2.x_;
long double dy = p1.y_ - p2.y_;
long double ans = sqrt( dx*dx + dy*dy );
return static_cast<T>(ans);
}

template< typename T >
struct Triang
{
Point<T> a_;
Point<T> b_;
Point<T> c_;
};

template< typename T >
T area( const Triang<T>& tr )
{
const T a = distance( a_, b_ );
const T b = distance( b_, c_ );
const T c = distance( c_, a_ );
long double s = static_cast<long double>( a + b + c ) / 2;
long double ans = s * ( s-a ) * ( s-b ) * ( s-c );
return static_cast<T>( sqrt(ans) );
}

template< typename T >
bool contain_orig( const Triang<T>& tr )
{
const T area = area( tr );
Triangle<T> small_triang;
Point<T> orig;
orig.x_ = T();
orig.y_ = T();

small_triang.a_ = tr.a_;
small_triang.b_ = tr.b_;
small_triang.c_ = orig;

const T area1 = area( small_triang );

small_triang.b_ = tr.c_;

const T area2 = area( small_triang );

small_triang.a = tr.b_;

const T area3 = area( small_triang );

return ( area == area1 + area2 + area3 );
}


template<>
bool contain_orig( const Triang<float>& tr )
{
float eps = 1e-6;
const float area = area( floatr );
Triangle<float> small_triang;
Poinfloat<float> orig;
orig.x_ = float();
orig.y_ = float();

small_triang.a_ = floatr.a_;
small_triang.b_ = floatr.b_;
small_triang.c_ = orig;

const float area1 = area( small_triang );

small_triang.b_ = floatr.c_;

const float area2 = area( small_triang );

small_triang.a = floatr.b_;

const float area3 = area( small_triang );

return ( area - ( area1 + area2 + area3 ) < eps );
}


#endif

winingsky 2008-11-16
  • 打赏
  • 举报
回复
up2楼!
arong1234 2008-11-16
  • 打赏
  • 举报
回复
三角形ABC,点P,做射线AP交BC于H,如果H在AP外,且H在BC上,则点P在三角形内

A(xa,ya)
B(xb,yb)
C(xc,yc)
P(xp,yp)
从A向P做的射线满足方程
x=t* xa +(1-t)*xp
y=t* ya +(1-t)*yp
如果0<t<1,则点(x,y)在AP之间
同理得到BC上点的方程
x=s* xb +(1-s)*xc
y=s* yb +(1-s)*yc

x和y分别相等,得到关于t,s的二元二次方程,解出的t,s如果满足t<0且0<s<1则就是在三角形内
ToBeTough 2008-11-16
  • 打赏
  • 举报
回复
百度搜的:希望有帮助
设三角形三个点
A(a1,a2),B(b1,b2),C(c1,c2)
三条边方程
BC:fa(x,y)=0
AC:fb(x,y)=0
AB:fc(x,y)=0
以BC为例,在三角形内的点必须与点A在BC的同侧
所以对于点D(x,y)
在三角形内首先要满足fa(x,y)*fa(a1,a2)>0
其他边也同理
所以只要比较
fa(x,y)*fa(a1,a2)
fb(x,y)*fb(b1,b2)
fc(x,y)*fc(c1,c2)
这三个数的正负性
1三个数都是正数:D在三角形内
2至少有一个负数:D在三角形外
3有且只有一个0,另两个为正数:在三角形边上
4有且只有一个0,一个正数一个负数:在三角形边的延长线上,也算在三角形外,因为满足2
5有二个0:在三角形的顶点上
6不可能出现3个0,或3个负数,或一个0两个负数的情况
aFlyingEagle 2008-11-16
  • 打赏
  • 举报
回复
先判断原点距离哪个点最近,然后算出原点到三个点距离的和是否大于刚才距离原点最近的那个点到其余两点的距离,要是大于就在三角形外,要是小于就在三角形内,不知道正确否,请楼主自己斟酌下!
aFlyingEagle 2008-11-16
  • 打赏
  • 举报
回复
个人想法,但不保证正确!
aFlyingEagle 2008-11-16
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;

void main()
{
double x = 0;
double y = 0;
double xnum[3];
double ynum[3];
cout<<"请分别输入三点的坐标:"<<endl;
int i=0;
while(i!=3)
{
cin>>x>>y;
xnum[i] = x;
ynum[i] = y;
i++;
}
double rim1 = sqrt(((0-xnum[0])*(0-xnum[0]))+((0-ynum[0])*(0-ynum[0])));
double rim2 = sqrt(((0-xnum[1])*(0-xnum[1]))+((0-ynum[1])*(0-ynum[1])));
double rim3 = sqrt(((0-xnum[2])*(0-xnum[2]))+((0-ynum[2])*(0-ynum[2])));
double l12 = sqrt(((xnum[0]-xnum[1])*(xnum[0]-xnum[1]))+((ynum[0]-ynum[1])*(ynum[0]-ynum[1])));
double l13 = sqrt(((xnum[0]-xnum[2])*(xnum[0]-xnum[2]))+((ynum[0]-ynum[2])*(ynum[0]-ynum[2])));
double l23 = sqrt(((xnum[1]-xnum[2])*(xnum[1]-xnum[2]))+((ynum[1]-ynum[2])*(ynum[1]-ynum[2])));
if(rim1<rim2&&rim1<rim3)
{
if((rim1+rim2+rim3)<=(l12+l13))
cout<<"原点在三角形内";
else
cout<<"原点不在三角形内";
}
if(rim2<rim1&&rim2<rim3)
{
if((rim1+rim2+rim3)<=(l12+l23))
cout<<"原点在三角形内";
else
cout<<"原点不在三角形内";
}
if(rim3<rim2&&rim3<rim1)
{
if((rim1+rim2+rim3)<=(l23+l13))
cout<<"原点在三角形内";
else
cout<<"原点不在三角形内";
}
}

Qlaiaqu 2008-11-16
  • 打赏
  • 举报
回复
这是数学知识,我测试了一下,这个矩阵计算的验证方法无法测试边界值的情况,但是非常符合你的在三角里的条件。以下设置的数据就是不能被测试的在边上的点的情况,但是将a,b数据调换,结果又是对的,这说明,原点在边界上时的情况结果判断是不确定的。
http://www.mathchina.com/cgi-bin/topic.cgi?forum=5&topic=4595

#include <stdio.h>

typedef struct _Point
{
double x;
double y;
}Point;

int main()
{
Point a = {1,0},b = {-1,0},c = {0,1};
double x,y,z;

if((x = a.x*b.y - a.y*b.x) < 0)
printf("It is not contain the zero point!");
else if((y = b.x*c.y - b.y*c.x) < 0)
printf("It is not contain the zero point!");
else if((z = c.x*a.y - c.y*a.x) < 0)
printf("It is not contain the zero point!");
else
printf("It is contain the zero point!");
return 0;
}
xiaosaner3 2008-11-16
  • 打赏
  • 举报
回复
up
aaajj 2008-11-16
  • 打赏
  • 举报
回复
不错,找到方法就可以了

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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