Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 制作一个函数来查找任意线段和正方形的交点_Java_Math_Graphics - Fatal编程技术网

Java 制作一个函数来查找任意线段和正方形的交点

Java 制作一个函数来查找任意线段和正方形的交点,java,math,graphics,Java,Math,Graphics,我正在用Java开发一个游戏引擎,我遇到了一个问题 我正在尝试将我的世界空间对象投影到视图空间。我有一个视锥台,它的假想顶点已定义(我们称之为视锥台的“眼睛”。如果视锥台的顶部未被“切割”,则视锥台的边缘将在此处相交)。我的对象的所有顶点都要通过线段连接到眼睛。这条线与平截头体小端相交的位置是屏幕上显示的对象的x和y坐标 我的问题是确定它们在哪里与平截头体的小端相交。我对此进行了思考和研究,但我找不到任何资源来说明应该如何做 我现在的课程如下: 类Point——一个基本上包含x-y-z变量的简单

我正在用Java开发一个游戏引擎,我遇到了一个问题

我正在尝试将我的世界空间对象投影到视图空间。我有一个视锥台,它的假想顶点已定义(我们称之为视锥台的“眼睛”。如果视锥台的顶部未被“切割”,则视锥台的边缘将在此处相交)。我的对象的所有顶点都要通过线段连接到眼睛。这条线与平截头体小端相交的位置是屏幕上显示的对象的x和y坐标

我的问题是确定它们在哪里与平截头体的小端相交。我对此进行了思考和研究,但我找不到任何资源来说明应该如何做

我现在的课程如下:

类Point
——一个基本上包含x-y-z变量的简单类。我还使用Point类来表示向量

类平截头体
,它基本上是八个点,形成一个挤压的正方形形状

类三角形
,基本上是三个点。它有几种方法来处理这些点

我还有几个已经过彻底测试的功能:

两倍距离(点p1、点p2)
——计算两个3d点之间的距离

点获取法线向量(点p1、点p2、点p3)
——获取三个共面点的法线向量

void NormalizeVector(p点)
——规范化向量

double GetDotProduct(点p1,点p2)
——获取两点的点积

int[]GetSharedSide(三角形t1,三角形t2)
--获取两个三角形的共享边

void MovePointAlongVector(点、点方向、浮动距离)
将给定点沿给定向量移动给定量

如果你能用已经存在的函数找到答案那就太好了,但是我可以添加更多的实用函数


这对游戏引擎来说非常重要——可以说这个函数是最重要的一个。我想这将需要一些几何和三角学。这将是完美的,因为我最近在高中学习了这两门课程!

你真的在看投影变换

考虑这样一种情况,即眼睛位于原点,平台的方端位于
x=1
平面。如果我们取点
(x,y,z)
,从眼睛到点的直线上的点的形式将为
(ax,ay,az)
。现在如果
a=1/x
,则给出点
(1,y/x,z)

解决此问题的最简单方法是设置变换库。这样可以应用旋转和其他变换,以矩阵表示。最简单的方法是使用4×4矩阵,因为这样可以将平移表示为矩阵。使用此库,可以变换场景,使眼睛位于原点,法线位于终点平截头体的方向是沿着一条主轴

更复杂的方法是一般线段平面相交。为此,计算平面的法线n,并找到平面到原点的距离,使用点积取
d=p.n
。对于从点A到点B的线段,计算两个点积
d1=A.n
d2=B.n
与d1和d2中的一个相交的线段应大于d,而另一个应小于d。现在可以使用线性插值找到两者之间的点。线段上的点由

m A + (1 - m) B
我们希望它与法线的点积为
d

(m A + (1 - m) B) . n = d
m A . n + (1 - m) B . n = d
m d1 + (1 - m) d2 = d
m (d1 - d2) + d2 = d
m = (d - d2) / (d1 - d2)
这将给出参数,然后可以使用该参数查找线段上的交点


许多库都有一个可以进行线性插值的lerp函数。

您实际上看到的是投影变换

考虑这样一种情况,即眼睛位于原点,平台的方端位于
x=1
平面。如果我们取点
(x,y,z)
,从眼睛到点的直线上的点的形式将为
(ax,ay,az)
。现在如果
a=1/x
,则给出点
(1,y/x,z)

解决此问题的最简单方法是设置变换库。这样可以应用旋转和其他变换,以矩阵表示。最简单的方法是使用4×4矩阵,因为这样可以将平移表示为矩阵。使用此库,可以变换场景,使眼睛位于原点,法线位于终点平截头体的方向是沿着一条主轴

更复杂的方法是一般线段平面相交。为此,计算平面的法线n,并找到平面到原点的距离,使用点积取
d=p.n
。对于从点A到点B的线段,计算两个点积
d1=A.n
d2=B.n
与d1和d2中的一个相交的线段应大于d,而另一个应小于d。现在可以使用线性插值找到两者之间的点。线段上的点由

m A + (1 - m) B
我们希望它与法线的点积为
d

(m A + (1 - m) B) . n = d
m A . n + (1 - m) B . n = d
m d1 + (1 - m) d2 = d
m (d1 - d2) + d2 = d
m = (d - d2) / (d1 - d2)
这将给出参数,然后可以使用该参数查找线段上的交点


许多库都有一个可以进行线性插值的lerp函数。

欢迎使用Stack Overflow。你的问题太宽泛了,这意味着你在一个问题中要求太多。如果你在一个更具体的问题周围发布代码也会更好。我基本上是在寻求帮助,制作一个函数来找到相交点在直线和正方形上。这真的太宽了吗?如果我有这个函数的任何代码要发布,我会