这是一个分支另一个问题 ,并与做基思·兰德尔的回答这个问题。 请不要有一个快速查看图像有下面就看看哪些功能正在努力做的事。
总之,在2D网格任意两点不得不如果两个对角线的交点x2 != x1
和y2 != y1
。 我实现了以下功能,但无法弄清楚如何确定从哪个减去细胞三角洲和添加到。 其结果是,对于一些对坐标,而对于其他人,他们是相反的结果是准确的。
// This class is the same as [Point] except
// it uses BigInteger instead of Int32 types.
public class Cell
{
System.Numerics.BigInteger X = 0;
System.Numerics.BigInteger Y = 0;
}
public List<Cell> GetIntersections (Cell c1, Cell c2)
{
List<Cell> cells = new List<Cell>();
System.Numerics.BigInteger delta = 0;
System.Numerics.BigInteger deltaHalf = 0;
System.Numerics.BigInteger width = 0;
System.Numerics.BigInteger height = 0;
width = System.Numerics.BigInteger.Abs(c2.X - c1.X);
height = System.Numerics.BigInteger.Abs(c2.Y - c1.Y);
delta = System.Numerics.BigInteger.Abs(height - width);
deltaHalf = System.Numerics.BigInteger.Divide(delta, 2);
// INTRODUCE CONDITIONS HERE TO DETERMINE +/- COMBINATION.
cells.Add(new Cell(c1.X - deltaHalf, c1.Y + deltaHalf));
cells.Add(new Cell(c2.X + deltaHalf, c2.Y - deltaHalf));
return (cells);
}
起初我以为这是一个简单的梯度/斜率的问题,但我似乎无法找到之间的一致的相关性slope
和+/- deltaHalf
组合。
重要提示:请注意,可以接受的答案应该只做X1,Y1,X2,Y2比较。 实际计算直线的斜率是不是由于性能损失的选项。 我们对2已经做了分工,不能再次承受。
你不能简单的用斜边( delta
)。 你必须发现三角形的高度 。 而且,正如你所看到的,得到高度必须计算腿(利用勾股定理)。
然而,要实现这一点使用BigInteger
将需要一些额外的帮助,因为会有一个平方根。 我所使用的溶液这里提供 ( 牛顿拉夫逊法 )。
让我们的价值观:
// leg = sqrt(hypoteneuse²)/2)
triangleLeg = SqRtN(System.Numerics.BigInteger.Divide(System.Numerics.BigInteger.Pow(delta, 2), 2));
// altitude = leg²/hypoteneuse
triangleAltitude = System.Numerics.BigInteger.Divide(System.Numerics.BigInteger.Pow(triangleLeg, 2), delta);
现在,到了点,我们将使用deltaHalf
(用于Y)和triangleAltitude
(为X)。
我所做的是这样的:
// INTRODUCE CONDITIONS HERE TO DETERMINE +/- COMBINATION.
cells.Add(
new Cell()
{
X = c1.X < c2.X? c1.X - triangleAltitude : c1.X + triangleAltitude,
Y = c1.Y < c2.Y ? c1.Y - deltaHalf : c1.Y + deltaHalf
}
);
cells.Add(
new Cell()
{
X = c2.X < c1.X ? c2.X - triangleAltitude : c2.X + triangleAltitude,
Y = c2.Y < c1.Y ? c2.Y - deltaHalf : c2.Y + deltaHalf
}
);
任何反馈将不胜感激。
我知道答案是什么地方在简单的比较,而不必计算斜边。
public List<Cell> GetCellIntersections (Cell cell1, Cell cell2)
{
Cell c1 = null;
Cell c2 = null;
List<Cell> cells = null;
System.Numerics.BigInteger delta = 0;
System.Numerics.BigInteger deltaHalf = 0;
System.Numerics.BigInteger width = 0;
System.Numerics.BigInteger height = 0;
cells = new List<Cell>();
// Sorting on y reduces conditions from 8 to 4.
if (cell1.Y < cell2.Y)
{
c1 = cell1;
c2 = cell2;
}
else
{
c1 = cell2;
c2 = cell1;
}
if ((c1.X != c2.X) && (c1.Y != c2.Y))
{
width = System.Numerics.BigInteger.Abs(c2.X - c1.X);
height = System.Numerics.BigInteger.Abs(c2.Y - c1.Y);
delta = System.Numerics.BigInteger.Abs(height - width);
deltaHalf = System.Numerics.BigInteger.Divide(delta, 2);
if ((c1.X < c2.X) && (c1.Y < c2.Y))
{
if (width < height)
{
cells.Add(new Cell(this, c1.X - deltaHalf, c1.Y + deltaHalf));
cells.Add(new Cell(this, c2.X + deltaHalf, c2.Y - deltaHalf));
}
else
{
cells.Add(new Cell(this, c1.X + deltaHalf, c1.Y - deltaHalf));
cells.Add(new Cell(this, c2.X - deltaHalf, c2.Y + deltaHalf));
}
}
else
{
if (width < height)
{
cells.Add(new Cell(this, c1.X + deltaHalf, c1.Y + deltaHalf));
cells.Add(new Cell(this, c2.X - deltaHalf, c2.Y - deltaHalf));
}
else
{
cells.Add(new Cell(this, c1.X - deltaHalf, c1.Y - deltaHalf));
cells.Add(new Cell(this, c2.X + deltaHalf, c2.Y + deltaHalf));
}
}
}
return (cells);
}
文章来源: How to determine +/- sign when calculating diagonal intersections between two points in 2D space?