- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在理解 ccw(逆时针)算法时遇到一些问题:
int ccw (Point P0, Point P1, Point P2) {
dx1 = P1.x - P0.x;
dx2 = P2.x - P0.x;
dy1 = P1.y - P0.y;
dy2 = P1.y - P0.y;
if (dy1 * dx2 > dy2 * dx1) return -1;
if (dx1 * dy2 > dy1 * dx2) return 1;
if ((dx1 * dx2 < 0) || (dy1 * dy2 < 0)) return 1;
if ((dx1 * dx1 + dy1 * dy1) < (dx2 * dx2 + dy2 * dy2)) return -1;
return 0;
}
这段代码用于查看两条线是否相交:
bool intersect (Vector2D l1, Vector2D l2) {
return (((ccw(l1.start, l1.end, l2.start) * ccw(l1.start, l1.end, l2.end)) <= 0)
&& ((ccw(l2.start, l2.end, l1.start) * ccw(l2.start, l2.end, l1.start)) <= 0))
}
我能看懂intersect函数里面的代码,但是我不是很懂ccw函数里面的代码。
为什么不用叉积?
最佳答案
里面的代码ccw
函数是以一种相当特殊的方式编写的,但它确实使用了有时非常非正式地称为 叉积 的 2D 版本的东西。对于两个 vector (dx1, dy1)
和 (dx2, dy2)
该产品被定义为标量值等于
CP = dx1 * dy2 - dx2 * dy1;
(在形式上正确的术语中,CP
实际上是 vector (dx1, dy1, 0)
和 (dx2, dy2, 0)
的经典 3D 叉积的有符号大小。)显然,该值只是一个 em>标量(点)乘积,其中一个 vector 被其垂线所取代。
如果值为CP
为正,则从 (dx1, dy1)
开始的最短径向扫描至 (dx2, dy2)
逆时针旋转。否定CP
表示顺时针扫描。 CP
中的零表示共线 vector 。 (所有这些都假设 Y 轴指向上方,X 轴指向右侧。)
显然,CP > 0
条件等同于 dx1 * dy2 > dx2 * dy1
条件和 CP < 0
相当于dx1 * dy2 < dx2 * dy1
.这正是你的 ccw
前两个函数检查 if
秒。
剩余if
s 正在处理共线情况。
如果 vector 指向相反的方向(由第三个 if
检测到),即当 P0
时介于 P1
之间和 P2
, 函数总是返回 1
, 表示逆时针排序。好吧,我想这只是代码作者假定的约定。
最后,如果两个 vector 指向同一方向,即当P0
位于P1-P2
之外段,决定基于 vector 长度(第四个 if
)。如果P1
比 P2
更近至 P0
, 报告顺时针顺序。否则,如果 P2
更近,报告逆时针顺序。这也只是代码作者的约定。
而且,从其余代码来看,这与两条线的交集无关。它是关于两个片段的交集。
关于c++ - ccw算法讲解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26315401/
1、流程控制语句主要有if、ii...else、elseif(有时也可以写成else if)、switch四种。 PHP中语句格式为: if(条件满足) {执行语句} if(条件满足) {执行
目录 DFS初步概念 DFS例题-迷宫游戏 题目描述 输入输出格式 输入输出样例
This question两年前被问到,但它提到的资源要么不是很有帮助(恕我直言),要么链接不再有效。 必须有一些很好的教程才能理解 Phaser .我已经阅读了 javadoc,但我的眼睛呆滞了,因
This question两年前被问到,但它提到的资源要么不是很有帮助(恕我直言),要么链接不再有效。 必须有一些很好的教程才能理解 Phaser .我已经阅读了 javadoc,但我的眼睛呆滞了,因
这个正则出自这个网站 http://www.regexlab.com/zh/regref.htm 正向预搜索:"(?=xxxxx)","(?!xxxxx)"
chr(9)、chr(10)、chr(13)、chr(32)、chr(34) 所有关于 ASCII码的表格:[url]http://www.asciitable.com/[/url] chr(13)
我是一名优秀的程序员,十分优秀!