神秘大三角

题目描述

判断一个点与已知三角形的位置关系。

输入输出格式

输入格式:

前三行:每行一个坐标,表示该三角形的三个顶点

第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系

(详见样例)

所有坐标值均为整数。

输出格式:

若点在三角形内(不含边界),输出1;

若点在三角形外(不含边界),输出2;

若点在三角形边界上(不含顶点),输出3;

若点在三角形顶点上,输出4。

说句题外话:看到这个名字我就笑了,神♂秘DARK三♂角。。。。。

好啦!回归正题,这道题其实我只有80分,还是很不要脸地放上去了,我真的改不下去了!!!
我的想法就是看看能不能用叉积判断某点与两边的关系,但是要找到离原点最近的一点,这样就
很棒了!因为相对于两边一点而言,显然要是两直线与点叉积+-号不同,就可以知道是在中间,
即点在三角形内,要是同号就在之外了。但是我发现题解上没有一个人和我想得一样,好伤啊……
而且一定有BUG!!!!不然早就AAAAA了!!!!
var
 x,y:array[0..4]of longint;
 xx,yy,i,j,l1,f1,m1,m2,maxn,t1,t2:longint;
 s:string;
begin
maxn:=1;
 for i:=1 to 4 do
  begin
   readln(s);
    begin
     f1:=pos(',',s);
     l1:=length(s);
     maxn:=1;
     for j:=f1-1 downto 2 do begin
                              x[i]:=x[i]+maxn*(ord(s[j])-48);
                              maxn:=maxn*10;
                             end;maxn:=1;
     for j:=l1-1 downto f1+1 do begin
                                 y[i]:=y[i]+maxn*(ord(s[j])-48);
                                 maxn:=maxn*10;
                                end;
    end;
  end;
 for i:=1 to 3 do
  for j:=i to 3 do
   begin
    if x[i]>x[j] then begin
                       t1:=x[j];
                       x[j]:=x[i];
                       x[i]:=t1;
                       t2:=y[j];
                       y[j]:=y[i];
                       y[i]:=t2;
                      end;
    if x[i]=x[j]then if y[i]>y[j] then
     begin
      t1:=x[j];
      x[j]:=x[i];
      x[i]:=t1;
      t2:=y[j];
      y[j]:=y[i];
      y[i]:=t2;
     end;
   end;
   m1:=(x[2]-x[1])*(y[4]-y[1])-(x[4]-x[1])*(y[2]-y[1]);
   m2:=(x[3]-x[1])*(y[4]-y[1])-(x[4]-x[1])*(y[3]-y[1]);
   if ((x[4]=x[1])and(y[4]=y[1]))or((x[4]=x[2])and(y[4]=y[2]))or
      ((x[4]=x[3])and(y[4]=y[3]))then begin
                                       write('4');
                                       halt;
                                      end;
   if (m1<0)and(m2>0)then begin
                           write('1');
                           halt;
                          end;
if (m1=0)or(m2=0)then
    begin
     write('3');
     halt;
    end;
   if ((m1<0)and(m2<0))or((m1>0)and(m2>0))then begin
                                                write('2');
                                                halt;
                                               end;
{   for i:=1 to 4 do writeln(x[i],y[i]);
   writeln(f1,l1);    }
end.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值