【计算几何】判断线段相交 pascal …

【计算几何】判断线段相交

Time Limit:1000MS  Memory Limit:65536K
Total Submit:13 Accepted:8

Description

线段相交(linecross.pas/c/cpp)

【问题描述】

    基本问题:判断二维平面上的两条线段是否相交。
  注意:相交有很多种,这里指的“相交”是指两条线段恰好有唯一一个不是端点的公共点,我们称为“规范相交”。即如果一条线段的一个端点恰在另一线段上,则不视为相交;如果两条线段部分重合,也不视为相交,(这些情况我们称为“非规范相交”)


【计算几何】判断线段相交 <wbr>pascal <wbr>解题报告

Input

输入共两行,每行四个实数,分别表示一条线段的两个端点:(x1,y1),(x2,y2)

Output

如果规范相交,则输出“YES”
否则,输出“NO”

Sample Input

4 8 11 14
9 3 5 23

Sample Output

YES

Source

 

向量的叉乘

 

a×b<>b×a
Xa=a[head].x-a[tail].x
Xa<>abs(a[head].x-a[tail].x)
 
当a×b>0 说明 b在a的左边
当a×b<0 说明 b在a的右边
当a×b=0 说明 b和a的共线
 
【计算几何】判断线段相交 <wbr>pascal <wbr>解题报告

【计算几何】判断线段相交 <wbr>pascal <wbr>解题报告
第一步是为了优化,减少运算第二步的次数。

var
 a:array[1..4,1..2]of longint;

function max(x,y:longint):longint;
begin
 if x>y then exit(x)
        else exit(y)
end;

function min(x,y:longint):longint;
begin
 if x<y then exit(x)
        else exit(y)
end;

function cha_ji(l1,l2,l3:longint):longint;
begin
 exit((a[l2,1]-a[l1,1])*(a[l3,2]-a[l1,2])-(a[l3,1]-a[l1,1])*(a[l2,2]-a[l1,2]));
end;

begin
 read(a[1,1],a[1,2],a[2,1],a[2,2]);
 read(a[3,1],a[3,2],a[4,1],a[4,2]);

 if not ((min(a[1,1],a[2,1])<=max(a[3,1],a[4,1]))and
         (max(a[1,1],a[2,1])>=min(a[3,1],a[4,1]))and
         (min(a[1,2],a[2,2])<=max(a[3,2],a[4,2]))and
         (max(a[1,2],a[2,2])>=min(a[3,2],a[4,2]))) then
  begin
  writeln('NO');
  exit;
  end;

 if (cha_ji(1,2,3)*cha_ji(1,2,4)<0) and(cha_ji(3,4,2)*cha_ji(3,4,1)<0) then
  writeln('YES')
  else
  writeln('NO');
end.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值