Frage

Ich habe eine Linie, die ich in einem Fenster ziehen und ich lasse den Benutzer zieht es um. So ist meine Linie durch zwei Punkte definiert: (x1, y1) und (x2, y2). Aber jetzt würde Ich mag „Caps“ am Ende meiner Linie zu zeichnen, die, kurze senkrechte Linien an jedem meiner Endpunkte ist. Die Kappen sollten N Pixel lang sein.

So zu meinen „cap“ line am Endpunkt (x1, y1) zu zeichnen, ich brauche zwei Punkte zu finden, die eine senkrechte Linie bilden und in denen jeder ihrer Punkte sind N / 2 Pixel entfernt von dem Punkt (x1, y1).

Wie berechnen Sie einen Punkt (x3, y3) gegeben es in einem senkrechten Abstand sein muss, N / 2 vom Endpunkt (x1, y1) einer bekannten Linie, dh die Linie, die durch (x1 definiert, y1) und (x2, y2)?

War es hilfreich?

Lösung

Sie benötigen einen Einheitsvektor zu berechnen, die auf dem Liniensegment ist senkrecht. Vermeiden Sie die Berechnung der Steigung, weil das zu Division durch Null-Fehler führen kann.

dx = x1-x2
dy = y1-y2
dist = sqrt(dx*dx + dy*dy)
dx /= dist
dy /= dist
x3 = x1 + (N/2)*dy
y3 = y1 - (N/2)*dx
x4 = x1 - (N/2)*dy
y4 = y1 + (N/2)*dx

Andere Tipps

Sie bewerten gerade die orthogonale Versor und multiplizieren Sie mit N / 2

vx = x2-x1
vy = y2-y1
len = sqrt( vx*vx + vy*vy )
ux = -vy/len
uy = vx/len

x3 = x1 + N/2 * ux
Y3 = y1 + N/2 * uy

x4 = x1 - N/2 * ux
Y4 = y1 - N/2 * uy

Da die Vektoren, von 2 bis 1 und 1 bis 3 stehen senkrecht, ihr Skalarprodukt ist 0.

Dies läßt Sie mit zwei Unbekannten: x von 1 bis 3 (x13) und y von 1 bis 3 (Y13)

Mit dem Satz des Pythagoras für die Unbekannten eine andere Gleichung zu erhalten.

für jede unbekannte durch Substitution lösen ...

Dies erfordert quadriert und unsquaring, so verlieren Sie die Zeichen im Zusammenhang mit Ihren Gleichungen.

das Zeichen zu bestimmen, betrachten:

while x21 is negative, y13 will be positive
while x21 is positive, y13 will be negative
while y21 is positive, x13 will be positive
while y21 is negative, x13 will be negative

Bekannte: Punkt 1: x1, y1

Bekannte: Punkt 2: x2, y2

x21 = x1 - x2
y21 = y1 - y2

Bekannte: Entfernung | 1-> 3 | : N / 2

Gleichung a: Satz des Pythagoras

x13^2 + y13^2 = |1->3|^2
x13^2 + y13^2 = (N/2)^2

Bekannte: Winkel 2-1-3: right angle

Vektoren 2-> 1 und 1-> 3 senkrecht

2> 1 dot 1-> 3 ist, 0

Gleichung b: Skalarprodukt = 0

x21*x13 + y21*y13 = 2->1 dot 1->3
x21*x13 + y21*y13 = 0

Verhältnis b / w x13 und y13:

x21*x13 = -y21*y13
x13 = -(y21/x21)y13

x13 = -phi*y13

Gleichung a: gelöst für Y13 mit Verhältnis

  plug x13 into a
phi^2*y13^2 + y13^2 = |1->3|^2

  factor out y13
y13^2 * (phi^2 + 1) = 

  plug in phi
y13^2 * (y21^2/x21^2 + 1) = 

  multiply both sides by x21^2
y13^2 * (y21^2 + x21^2) = |1->3|^2 * x21^2

  plug in Pythagorean theorem of 2->1
y13^2 * |2->1|^2 = |1->3|^2 * x21^2

  take square root of both sides
y13 * |2->1| = |1->3| * x21

  divide both sides by the length of 1->2
y13 = (|1->3|/|2->1|) *x21

  lets call the ratio of 1->3 to 2->1 lengths psi
y13 = psi * x21

  check the signs
    when x21 is negative, y13 will be positive
    when x21 is positive, y13 will be negative

y13 = -psi * x21

Gleichung a: gelöst für x13 mit Verhältnis

  plug y13 into a
x13^2 + x13^2/phi^2 = |1->3|^2

  factor out x13
x13^2 * (1 + 1/phi^2) = 

  plug in phi
x13^2 * (1 + x21^2/y21^2) = 

  multiply both sides by y21^2
x13^2 * (y21^2 + x21^2) = |1->3|^2 * y21^2

  plug in Pythagorean theorem of 2->1
x13^2 * |2->1|^2 = |1->3|^2 * y21^2

  take square root of both sides
x13 * |2->1| = |1->3| * y21

  divide both sides by the length of 2->1
x13 = (|1->3|/|2->1|) *y21

  lets call the ratio of |1->3| to |2->1| psi
x13 = psi * y21

  check the signs
    when y21 is negative, x13 will be negative
    when y21 is positive, x13 will be negative

x13 = psi * y21

kondensieren

x21 = x1 - x2
y21 = y1 - y2

|2->1| = sqrt( x21^2 + y^21^2 )
|1->3| = N/2

psi = |1->3|/|2->1|

y13 = -psi * x21
x13 =  psi * y21

Normalerweise würde ich dies nicht tun, aber ich löse es bei der Arbeit und dachte, dass es gründlich erklären würde mir helfen, mein Wissen zu verfestigen.

Wenn Sie eine sqrt vermeiden wollen, gehen Sie wie folgt vor:

in: line_length, cap_length, rotation, position of line centre

define points:
  tl (-line_length/2, cap_length)
  tr (line_length/2, cap_length)
  bl (-line_length/2, -cap_length)
  br (line_length/2, -cap_length)

rotate the four points by 'rotation'
offset four points by 'position'

drawline (midpoint tl,bl to midpoint tr,br)
drawline (tl to bl)
drawline (tr to br)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top