//(b-a)^(c-b)符号得出是顺时针序还是逆时针序,然后用叉积判断其他点是否在三角形内(边为逆时针序的情况下,点同时在三条边的左边则为在三角形内。
//此法同样适用于判断点是否在凸多边形内)
#include <iostream>
#include <algorithm>
using namespace std;
static int n;
struct Point
{
int x;
int y;
int num;
Point(){}
Point(char _s,int _x,int _y):num(_s-'A'),x(_x),y(_y)
{
}
}Pts[25];
static int area(Point&ls,Point&rs,Point&p0)
{
return (ls.x-p0.x)*(rs.y-p0.y) - (ls.y-p0.y)*(rs.x-p0.x);
}
//判断点是否在多边形内部
static bool isPtIn(int a0,int a1,int a2)
{
for (int i=0;i<n;++i)
{
if (i!=a0&&i!=a1&&i!=a2)
{
int s1 = (Pts[i].x-Pts[a0].x)*(Pts[a1].y-Pts[a0].y)-(Pts[a1].x-Pts[a0].x)*(Pts[i].y-Pts[a0].y);
int s2 = (Pts[i].x-Pts[a0].x)*(Pts[a2].y-Pts[a0].y)-(Pts[a2].x-Pts[a0].x)*(Pts[i].y-Pts[a0].y);
int s3,s4;
if (s1*s2<=0)
{
s3 = (Pts[i].x-Pts[a1].x)*(Pts[a0].y-Pts[a1].y)-(Pts[a0].x-Pts[a1].x)*(Pts[i].y-Pts[a1].y);
s4 = (Pts[i].x-Pts[a1].x)*(Pts[a2].y-Pts[a1].y)-(Pts[a2].x-Pts[a1].x)*(Pts[i].y-Pts[a1].y);
if (s3*s4<=0)return true;
}
}
}
return false;
}
int main()
{
while(scanf("%d",&n)&&n)
{
int x,y;
for (int i=0;i<n;++i)
{
char c;
scanf(" %c %d %d",&c,&Pts[i].x,&Pts[i].y);
Pts[i].num = c-'A';
}
int ans = 0;
int p0,p1,p2;
//枚举所有点
for (int i=0;i<n;++i)
{
for (int j=0;j<n;++j)
{
if(i!=j)
for (int k=0;k<n;++k)
{
if (k==i||j==k)continue;
if (!isPtIn(i,j,k))//没有点在内部
{
int tmp = area(Pts[i],Pts[j],Pts[k]);
if (tmp>ans)
{
ans = tmp;
p0 = Pts[i].num;p1=Pts[j].num;p2=Pts[k].num;
}
}
}
}
}
int nums[3] = {p0,p1,p2};
sort(nums,nums+3);
for (int i=0;i<3;++i)
printf("%c",nums[i]+'A');
printf("\n");
}
return 0;
}
POJ1569叉乘判断点在三角形内部
最新推荐文章于 2023-05-15 15:16:46 发布