- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一条线,我必须对该线经过的每个网格方 block 进行计算。
我已经使用 Superline 算法得到所有这些网格方 block 。这为我提供了一个要检查的 X、Y 坐标数组。
现在,这就是我卡住的地方,我需要能够计算通过每个网格方 block 的距离...例如,在一条既不是 90 度角也不是 45 度角的线上,每个网格方 block 适应总行的不同“长度”。
Image example here, need 10 reputation to post images
如您所见,一些方 block 中的“线长”比其他方 block 多得多 - 这就是我需要找到的。
我如何为每个网格正方形计算出这个值?我已经有一段时间了,请求 Stack Overflowers 的帮助!
最佳答案
可能有一些聪明的方法可以更快更容易地做到这一点,但你总是可以像这样破解它:
你知道距离公式:s=sqrt((x2-x1)^2+(y2-y1)^2)。要应用这一点,您必须找到该线与每个网格单元的边缘相交的点的 x 和 y 坐标。为此,您可以将单元格边界的 x 和 y 坐标代入直线方程,并根据需要求解 x 或 y。
也就是说,每个单元格从某个点 (x0,y0) 延伸到 (x0+1,y0+1)。所以我们需要找到 y(x0)、y(x0+1)、x(y0) 和 x(y0+1)。对于其中的每一个,找到的 x 或 y 值可能在也可能不在该单元格的坐标范围内。具体来说,其中两个会,两个不会。两个对应的是直线穿过的边,两个不对应的是没有穿过的边。
好吧,也许这听起来很令人困惑,所以让我们通过一个例子来研究。
假设您的直线具有等式 x=2/3 * y。您想知道它与从 (1,0) 延伸到 (2,1) 的单元格边缘相交的位置。
代入 x=1 得到 y=2/3。 2/3 在 y 的合法范围内——0 到 1——所以 (1,2/3) 是直线与该单元格相交的边缘上的一个点。即,左边缘。
代入 x=2 得到 y=4/3。 4/3 在 y 的范围之外。所以这条线没有穿过右边缘。
代入 y=0,你得到 x=0。 0 不在 x 的范围内,因此该线不通过底部边缘。
代入 y=1,你得到 x=3/2。 3/2 在 x 的合法范围内,因此 (3/2,1) 是另一个交点,在上边缘。
因此,直线与单元格边缘相交的两个点是 (1,2/3) 和 (3/2,1)。将这些代入距离公式,您将得到通过该单元格的线段的长度,即 sqrt((1-3/2)^2+(2/3-1)^2)=sqrt(1/4 +1/9)=平方(13/36)。您可以将其近似到任何所需的精度水平。
要在程序中执行此操作,您需要类似以下内容:(我将使用伪代码,因为我不知道您使用的是什么语言)
// Assuming y=mx+b
function y(x)
return mx+b
function x(y)
return (y-b)/m
// cellx, celly are co-ordinates of lower left corner of cell
// Upper right must therefore be cellx+1, celly+1
function segLength(cellx, celly)
// We'll create two arrays pointx and pointy to hold co-ordinates of intersect points
// n is index into these arrays
// In an object-oriented language, we'd create an array of point objects, but whatever
n=0
y1=y(cellx)
if y1>=celly and y1<=celly+1
pointx[n]=cellx
pointy[n]=y1
n=n+1
y2=y(cellx+1)
if y2>=celly and y2<=celly+1
pointx[n]=cellx+1
pointy[n]=y2
n=n+1
x1=x(celly)
if x1>=cellx and x1<=cellx+1
pointx[n]=x1
pointy[n]=celly
n=n+1
x2=x(celly+1)
if x2>=cellx and x2<=cellx+1
pointx[n]=x2
pointy[n]=celly+1
n=n+1
if n==0
return "Error: line does not intersect this cell"
else if n==2
return sqrt((pointx[0]-pointx[1])^2+(pointy[0]-pointy[1])^2)
else
return "Error: Impossible condition"
好吧,我相信您可以使代码更简洁一些,但就是这样。
关于math - 计算交叉点的长度(通过二维网格),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3609382/
我正在准备数据库关系的自动文档。该工具是graphviz。我的问题是输出图像上节点的放置不是最佳的,并且有许多不必要的边缘交叉。 是否有任何方法可以执行图形的优化,以便结果将具有最小边交叉(交叉)?
如何判断圆和矩形在二维欧几里得空间中是否相交? (即经典的二维几何) 最佳答案 这是我的做法: bool intersects(CircleType circle, RectType rect) {
切换到 Aframe 的主版本后,光线转换器相交事件似乎变为空,尽管我保留了完全相同的代码: 使用注册组件: AFRAME.registerComponent('collider-check', {
就效率而言,Strassen 算法应该停止递归并应用乘法的最佳交叉点是多少? 我知道这与具体的实现和硬件密切相关,但对于一般情况应该有某种指南或某人的一些实验结果。 在网上搜索了一下,问了一些他们认为
我正在尝试使用 jquery 来切换某些类的显示属性(打开和关闭)。 我正在尝试在图像和下面的文本之间切换,以在点击时切换 Charity Run
我创建了一张 map ,其中每 1/4 分钟绘制一次纬度和经度线。生成的框称为“刻钟分钟”。我需要给每个刻钟框贴上标签。标签应该是盒子内西南 Angular 的纬度/经度。由于我先绘制可视区域内的所有
我只需要一种方法来告诉我轴对齐的 3D 边界框是否与线段(不是射线)相交。我不需要交点。 盒子由两个对角定义,线段由起点和终点定义,如下所示: Boolean intersection(Vector3
我是一名优秀的程序员,十分优秀!