三点顺序

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描写叙述

如今给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,如今让你推断A,B,C是顺时针给出的还是逆时针给出的?

如:

图1:顺时针给出

图2:逆时针给出

<图1>                   <图2>

输入
每行是一组測试数据,有6个整数x1,y1,x2,y2,x3,y3分别表示A,B,C三个点的横纵坐标。(坐标值都在0到10000之间)

输入0 0 0 0 0 0表示输入结束

測试数据不超过10000组
输出
假设这三个点是顺时针给出的。请输出1。逆时针给出则输出0
例子输入
0 0 1 1 1 3
0 1 1 0 0 0
0 0 0 0 0 0
例子输出
0
1
来源

source=%E8%AE%A1%E7%AE%97%E5%87%A0%E4%BD%95%E5%9F%BA%E7%A1%80" style="text-decoration:none; color:rgb(55,119,188)">计算几何基础

上传者

张云聪

開始做这道题时,自己一直在草稿纸上画。推断有多少种情况,仅仅是认为情况比較多,可能考虑的不全面,開始我就是依照以某一个点为顶点,然后写出判别条件。后来我自己写出来执行一看,得到的结果全是1。说明我情况考虑有反复了,我的思路可能就有偏差,包括了其它的情况。

if((y1>=y2&&y1>=y3&&x3<=x2)//以a为顶点
||(y2>=y1&&y2>=y3&&x3>=x1)//b为顶点
||(y3>=y2&&y3>=y1&&x1<=x2))//c为顶点
printf("1\n");
else if((y1>=y2&&y1>=y3&&x2<=x3)
||(y2>=y1&&y2>=y3&&x3<=x1)
||(y3>=y2&&y3>=y1&&x2<=x1))
printf("0\n");

后来一看讨论区,居然有公式。。。

对计算几何还是无感啊。。

曾经学过的公式也不会利用。利用了我们曾经学过的叉积。

利用矢量叉积推断是逆时针还是顺时针。设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则矢量叉积定义为由(0,0)、p1、p2和p1+p2 所组成的平行四边形的带符号的面积,即:P × Q
= x1*y2 - x2*y1。其结果是一个标量。显然有性质 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。

叉积的一个很重要性质是能够通过它的符号推断两矢量相互之间的顺逆时针关系:



  若 P × Q > 0 , 则P在Q的顺时针方向。

  若 P × Q < 0 , 则P在Q的逆时针方向。

  若 P × Q = 0 , 则P与Q共线,但可能同向也可能反向。

解释:

a×b=(ay * bz - by * az, az * bx - ax * bz, ax * by - ay * bx) 又由于az bz都为0,所以a×b=(0,0。 ax * by - ay * bx)

依据右手系(叉乘满足右手系),若 P × Q > 0,ax * by - ay * bx>0,也就是大拇指指向朝上,所以P在Q的顺时针方向。一下同理。

看了别人博客写的有关叉积的内容  http://blog.csdn.net/sjl_leaf/article/details/8789785 
顿时就茅舍顿开啊,十多行代码就攻克了;

#include <cstdio>
int main()
{
int x1,y1,x2,y2,x3,y3;
int flag;
while(scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3))
{
if(!x1&&!y1&&!x2&&!y2&&!x3&&!y3)
break;
flag=(x2-x1)*(y3-y1)-(y2-y1)*(x3-x1);
if(flag<0) printf("1\n");
else printf("0\n");
}
return 0;
}

把三点化成矢量式进行计算,AB=(x2-x1,y2-y1),AC=(x3-x1,y3-y1);

他们的叉积就是|x2-x1,y2-y1|

             |x3-x1,y3-y1|

利用行列式的计算。能够得出 flag=(x2-x1)*(y3-y1)-(y2-y1)*(x2-x1);

推断flag的值

1.flag<0 顺时针

2.flag>0 逆时针

3.flag=0 三点共线

nyis oj 68 三点顺序 (计算几何基础)的更多相关文章

  1. nyoj 68 三点顺序

    点击打开链接 三点顺序 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断A,B,C是顺时针给 ...

  2. 三点顺序_nyoj_68(计算几何).java

    三点顺序 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 3   描述 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断A,B,C是顺时针给出的 ...

  3. nyoj_68_三点顺序_201404152013

    三点顺序 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断A,B,C是顺时针给出的还是逆 ...

  4. 【ACM】三点顺序

    三点顺序 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断A,B,C是顺时针给出的还是逆 ...

  5. (计算几何基础 叉积) nyoj68-三点顺序

    68-三点顺序 内存限制:64MB 时间限制:1000ms 特判: No通过数:27 提交数:43 难度:3 题目描述: 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断 ...

  6. 二维计算几何基础题目泛做(SYX第一轮)

    题目1: POJ 2318 TOYS 题目大意: 给一个有n个挡板的盒子,从左到右空格编号为0...n.有好多玩具,问每个玩具在哪个空格里面. 算法讨论: 直接叉积判断就可以.注意在盒子的边界上面也算 ...

  7. Vue2.0源码阅读笔记(三):计算属性

      计算属性是基于响应式依赖进行缓存的,只有在相关响应式依赖发生改变时才会重新求值,这种缓存机制在求值消耗比较大的情况下能够显著提高性能. 一.计算属性初始化   Vue 在做数据初始化时,通过 in ...

  8. java se系列(三) 顺序语句、if...else、switch、While、do-while、for、break、continue

    1 顺序语句 语句:使用分号分隔的代码称作为一个语句. 注意:没有写任何代码只是一个分号的时候,也是一条语句,称作空语句. 顺序语句就是按照从上往下的顺序执行的语句. 2 判断(if…else) 什么 ...

  9. 【BZOJ】1043: [HAOI2008]下落的圆盘(计算几何基础+贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1043 唯一让我不会的就是怎么求圆的周长并QAAQ... 然后发现好神!我们可以将圆弧变成$[0, 2 ...

随机推荐

  1. CVE-2011-0104 Microsoft Office Excel缓冲区溢出漏洞 分析

    漏洞简述   Microsoft Excel是Microsoft Office组件之一,是流行的电子表格处理软件.        Microsoft Excel中存在缓冲区溢出漏洞,远程攻击者可利用此 ...

  2. 提高eclipse使用效率(二)—— 提高Android开发效率的小技巧

    XML文件的代码提示 adt中也有xml文件的代码提示,为了让提示来的更加猛烈,我们还要设置一下 打开eclipse - Window - Preferences,在右边的目录树中切换到XML - X ...

  3. 【AtCoder】ARC097 (C - F)题解

    C - K-th Substring 题解 找出第K大的子串,重复的不计入 这个数据范围可能有什么暴力可以艹过去吧,但是K放大的话这就是后缀自动机板子题啊= = 代码 #include <ios ...

  4. hdoj1233 还是畅通工程(Prime || Kruskal)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1233 思路 最小生成树问题,使用Prime算法或者Kruskal算法解决. 代码 Prime算法: # ...

  5. 2017-2018-1 20179202《Linux内核原理与分析》第九周作业

    进程的切换和系统的一般执行过程 1.知识总结 (1)进程调度的时机: 中断处理过程直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule(). 内核线程是一 ...

  6. [CodeForces]CodeForces 13D 几何 思维

    大致题意: 给出N个红点和M个蓝点,问可以有多少个红点构成的三角形,其内部不含有蓝点 假设我们现在枚举了一条线段(p[i],p[j]),我们可以记录线段下方满足(min(p[i].x,p[j].x)& ...

  7. sql中的if()和ifnull() 的用法和区别

    if() 把salary表中的女改成男,男改成女: update salary set sex = if( sex = '男','女','男'); if(true,a,b),  if(false,a, ...

  8. 使用Generator(小黑鸟)反向生成Java项目(IDEA + Maven)

    一.生成Maven项目 二.配置pom.xml文件 通用代码 <properties> <!-- 设置项目编码编码 --> <project.build.sourceEn ...

  9. Springboot listener

    在启动流程中,会出发许多ApplicationEvent.这时会调用对应的listener的onApplicationEvent方法.ApplicationEvent时观察者模式, (1) 实体继承A ...

  10. PHP反序列漏洞学习

    0x00 序列化和反序列化 在PHP中,序列化和反序列化对应的函数分别为serialize()和unserialize(). 序列化:serialize()将对象转换为字符串以便存储传输的一种方式. ...