【问题标题】:Intersecting Point for Circle Morphs圆变形的交点
【发布时间】:2012-09-12 01:30:41
【问题描述】:

我正在尝试借助此链接查找 Circle 的相交点。

以下注释描述了如何在平面上找到两个圆之间的交点,使用以下符号。目的是找到两个点 P3 = (x3, y3)(如果存在)。

首先计算圆心之间的距离d。 d = ||P1 - P0||。

如果 d > r0 + r1 则没有解,圆圈是分开的。 如果 d

a2 + h2 = r02 和 b2 + h2 = r12

使用 d = a + b 我们可以求解 a,

a = (r02 - r12 + d2 ) / (2 d)

可以很容易地证明,当两个圆在一点接触时,这会减少到 r0,即:d = r0 + r1 通过将 a 代入第一个方程来求解 h,h2 = r02 - a2 所以

P2 = P0 + a ( P1 - P0 ) / d

最后,根据 P0 = (x0,y0),P1 = (x1,y1) 和 P2 = (x2,y2),P3 = (x3,y3) 是

x3 = x2 +- h ( y1 - y0 ) / d

y3 = y2 -+ h ( x1 - x0 ) / d http://paulbourke.net/geometry/2circle/

b:=CircleMorph new.
b center: 60@60.
b openInWorld.
b1:=CircleMorph new.
b center: 100@100.
b1 openInWorld.
d:= b1 center - b center. // distance between 2 circles
r1:= (((b center x abs)squared +(b  center y abs)squared)sqrt).
r2:= (((b1 center x abs)squared +(b1  center y abs)squared)sqrt).
r3:= r1+ r2.
(d) > (r3) ifTrue:[Transcript show:'Circles are seprate';cr]

当我将距离与 2 个圆的半径之和进行比较时,得到的距离小于两个圆的半径,我知道这是不正确的,当圆是分开的时,我是否正确地计算了半径或没有 idk,这个帮助有一些问题。

【问题讨论】:

  • 你有没有想过使用 DrGeo2
  • 请注意// 不是评论的开始。 "Comments in Smalltalk look like this".

标签: geometry smalltalk pharo morphic


【解决方案1】:

一种可能的解决方案是:

| b b1 d r1 r2 r3 |
b := CircleMorph new.
b center: 60@60.
b bounds: (Rectangle origin: 100@40 corner: 40@100).
b openInWorld.
b1 := CircleMorph new.
b center: 100@100.
b bounds: (Rectangle origin: 100@40 corner: 40@100).
b1 openInWorld.
r1 := b bounds width / 2.
r2 := b1 bounds width / 2.
r3 := r1+ r2.
(d < r3)
    ifTrue: [| a h mid |
        a := (r1 squared - r2 squared + d squared) / (2 * d).
        h := (r1 squared - a squared) sqrt.
        mid := (b1 center x - b center x) @ (b1 center y - b center y).
        {(mid x + (h * (b1 center y - b center y))) @ (mid y - (h * (b1 center x - b center x))).
        (mid x - (h * (b1 center y - b center y))) @ (mid y + (h * (b1 center x - b center x)))}]
    ifFalse: ['separate']

你会想检查我的算术。 (更新:我没有使用两个圆心之间的点来计算点。)

【讨论】:

  • 另外d不是距离,是表示向量b到b1的x@y坐标的点,用(b1 center dist: b center)。
  • (LineSegment from: b1 center to: b center) length
  • 谢谢你,我现在明白了,如果距离= radius1 + radius2 (d=r1+r2) 我如何只得到一个交点???
  • 您需要特殊情况,可能使用(d - (r1 + r2)) &lt; 0.001 ifTrue: [...] 或类似名称。
  • 半径只是圆的bounds宽度的一半。所以它只是radius\n^ self bounds width / 2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 2010-10-07
相关资源
最近更新 更多