尽管是矩形的缩放比例,find一个点相对于矩形的角的位置的最有效的方法是什么?

我努力用C#(在Unity中)实现以下function。 我需要find距离矩形的一个给定距离(比方说1m)的点的位置,使得这些点与给定的矩形角之间的分段与相应的边形成135度矩形 – 无论矩形在哪里,它的旋转是什么,它的大小是多less。 如下所示:

在这里输入图像说明

所以用上面的图片作为参考,这意味着红色虚线总是有相同的长度,并将中间的角度ABC分开。 所以,与AB线的角度是135,而BC也是135。

实现这一目标的方法之一是以下代码:

Vector3 dotpos = rectangle.transform.TransformPoint(rectangle.transform.localPosition.x+1.5F,0,rectangle.transform.localPosition.z+1.5F); bluedot.transform.position = dotpos ; 

问题是,在这种解决scheme中,蓝点和矩形的拐角之间的距离并不独立于矩形的比例。 这意味着,矩形越大,蓝点越远离角落。

任何人都可以说出什么是最有效的方法来实现我想要的,也就是说,无论矩形的尺寸,位置或旋转,蓝点的位置总是与角落的距离相同。

PS:蓝点不是可以制作矩形的子对象。

假设你知道角落B的世界位置:

 vec3 dotpos = B - (rectangle.transform.forward + rectangle.transform.right).Normalize() * distance; 

注意:没有检查和正确的向量是“正确的”(AB和BC的方向),如果不是只是尝试其他对之一。
因为你知道单位平方的斜边的长度,你也可以用常数乘以1/sqrt(2)来代替标准化。
-(rectangle.transform.up + rectangle.transform.right)在AB和BC方向之间获得vector,减去用于反转。 这与计算角度是一样的。

我会做这个使用vector和角度。 您可以通过执行以下操作来获取线段AB与x轴形成的角度:

 angleAB = atan2(By - Ay, Bx - Ax); 

你可以在这个角度上加45°(或者π/ 4弧度),并从B中投射一个你想要的长度的点:

 newAngle = angleAB + (M_PI / 4.0); newPoint.x = Bx + length * cos(newAngle); newPoint.y = By + length * sin(newAngle); 

你可以这样做:

 bluedot.transform.localPosition = rectangle.transform.localPosition; bluedot.transform.localRotation = rectangle.transform.localRotation; bluedot.transform.localScale = Vector3.one; Vector3 dotpos = bluedot.transform.TransformPoint(1.5f + rectangle.localScale.x / 2, 0.0f, 1.5f + rectangle.localScale.z / 2); bluedot.transform.position = dotpos; bluedot.transform.rotation = Quaternion.identity; 

在这里,我使用bluedot的变换来保存临时值,因为Unity不允许在没有gameobjects的情况下使用变换。 Rectangle.localScale.x / 2是矩形宽度的一半…最后我用新的覆盖临时值。 希望你明白这一点。