请参阅下面的快速图表。
我要做的是通过使用红点已知坐标的角度来获取黄点的坐标。假设每个黄点距离x:50 / y约20个像素:直角250个红点(我认为这就是所谓的)我如何得到它们的坐标?
我相信这是非常基本的三角函数,我应该使用Math.tan(),但他们并没有在艺术学校教我们太多数学。
alt text http://www.freeimagehosting.net/uploads/e8c848a357.jpg
答案 0 :(得分:7)
你实际上并不需要这个触发器。只需使用斜率,或更改x
和y
。
给定一条斜线m = y/x
,垂直于该线的线具有斜率-1/m
或-x/y
。
红点之间的斜率m为-150/150
或-1/1
。我注意到你的积极y
点了。
因此,正斜率为1/1
。你的x和y都以相同的速度变化,但数量相同。
一旦你知道了,那么找出其余部分应该很容易。由于它们以45度角对齐,因此45-45-90
三角形的边缘比为1 : 1 : sqrt(2)
。因此,如果您的长度为20
,则单个x和y更改将为20/sqrt(2)
,或整数为14
。
因此,您的两个黄点位于(36, 236)
和(64, 264)
。如果线条没有对齐到一个方便的程度,你必须使用arctan()
或类似的东西,并获得线和水平线之间的角度,这样你就可以计算出x和y变化的比例。
我希望我的回答不太难以理解。有关更一般的解决方案,请参阅Troubadour的回答。
编辑由于OP说下面的红点实际上围绕上面的红点旋转,我们需要更灵活的解决方案。
我要从Troubadour的答案中扩展这个答案,因为我做的事情完全一样。当你读我的时,请参考他的帖子。
<强> 1。 获取从原点(200,100)到旋转点(50,250)的矢量:
vector = (200 - 50, 100 - 250) = (150, -150)
<强> 2。 通过交换x和y来旋转矢量,并取消x以获得新矢量:
vector = (150, -150) => swap => (-150, 150) => negate x => (150, 150)
第3。 从新向量中获取单位向量(长度为1):
vector = vector / length(vector)
= (150 / length(vector), 150 / length(vector))
~= (0.7071, 0.7071)
where
length(vector) = sqrt(150^2 + 150^2) ~= 212.2320
<强> 4。 通过乘以单位矢量获得长度为20的位移矢量。
displacement_vector = vector * 20
= (0.7071 * 20, 0.7071 * 20)
= (14.1421, 14.1421)
<强> 5。 向/从旋转矢量(点)添加/减去此矢量:
yellow_1 = (50, 250) + (14.1421, 14.1421) ~= (64, 254)
yellow_2 = (50, 250) - (14.1421, 14.1421) ~= (36, 236)
我希望上述步骤可以帮助您制定代码。不管它的角度是什么,同样的步骤。
答案 1 :(得分:4)
在(50,250)A处调用红点,在(200,100)B处调用红点。
一种方法是首先计算向量AB,即
v_AB = ( 200 - 50, 100 - 250 ) = ( 150, -150 )
您可以通过交换组件并反转两个组件之一的符号来生成与其成直角的矢量。所以
v_AB_perp = ( 150, 150 )
是在屏幕上查看时顺时针旋转v_AB旋转的矢量。您可以将其标准化以通过除以幅度来获得单位向量,即
v_AB_perp_normalised = v_AB_perp / |v_AB_perp|
要获得黄点,只需将其乘以20像素,然后将其相加或减去A的坐标。
答案 2 :(得分:2)
由于黄点与红 - 红线成直角关闭,因此您可以使用更简单的东西。我不会回答整个问题,但我会尝试提供一些线索:
忽略与黄点的实际距离,想象在同一NW-SE线上的其他点,与NE红点相同的距离。向量的向量就是红点的向量,旋转90度。
旋转90度可以通过交换坐标并反转其中一个来完成。
完成后,通过将实际距离(20)缩放,将黄点移动到更近的位置。
答案 3 :(得分:2)
这应该有效(我只会参考最左边的黄点,但最后我们会得到两者的坐标):
d2
找出黄点的坐标,以及距离最低红点的距离为20的事实。1 :
找到斜率:m = (y1 - y2) / (x1 - x2) = (250 - 100) / (50 - 200) = 150 / -150 = -1
2 :
我们知道d1
(红点之间的线)垂直于d2
(红点和黄点之间的线),因此其斜率的乘积必须为-1
。因此,d2
的斜率为m = 1
因此等式为:d2: y - 250 = x - 50 => d2: y - x = 200
对于3 :
所需的黄点位于d2
行,其与最低红点的距离为20
。求解方程组:
y - x = 200
(x - 50)^2 + (y - 250)^2 = 400
计算变得相当丑陋,但用mathematica解决它会给出:
{{x -> 35.8579, y -> 235.858}, {x -> 64.1421, y -> 264.142}}
这就是你的两个黄点所在的地方!
通过编程,您可以通过在第二个等式中替换y = 200 + x
,然后在一侧移动所有内容并将其解算为二次方程式来轻松解决此类系统。
答案 4 :(得分:1)
如果你知道它会保持在45度,这很容易。如果50,250的距离为20,则点位于(50 - (20*sqrt(2)), 250 - (20*sqrt(2)))
和(50 + (20/sqrt(2)), 250 + (20/sqrt(2)))
。
通常,每个20*sqrt(2)
部分应替换为(distance)*cos(angle)
和distance*sin(angle)
。一个用于x坐标,一个用于y坐标。 (取决于你测量角度的哪一边!)
总之,你应该使用sin和cos。 45度是一个特殊情况,其中sin和cos都是1/sqrt(2)
所以你使用它们的方式并不重要。