Gegeben ein Winkel und Maße, finden Sie eine Koordinate entlang des Umfangs eines Rechtecks

StackOverflow https://stackoverflow.com/questions/1026763

  •  06-07-2019
  •  | 
  •  

Frage

Ich Schreibe ein Skript, in dem die Symbole drehen sich rund um einen bestimmten Drehpunkt (oder Herkunft).Ich habe in der Lage gewesen, diese Arbeit zu machen, die für das drehen der Symbole um eine ellipse, aber ich will auch haben, Sie zu bewegen, um den Umfang von einem Rechteck eine bestimmte Breite, Höhe und Herkunft.

Ich mache es auf diese Weise, weil meine aktuellen code speichert die Koordinaten in einem array mit jedem Winkel Ganzzahl als Schlüssel und Wiederverwendung dieser code wäre viel einfacher, mit zu arbeiten.

Wenn jemand könnte mir ein Beispiel für eine 100x150 Rechteck, das wäre toll.

EDIT: um zu klären, durch drehen um ich meine Bewegung um den Umfang (oder Orbit) von einer Form.

War es hilfreich?

Lösung

Wissen Sie die Größe des Rechtecks, und Sie müssen zu trennen die ganzen Winkel Intervall, in vier verschiedenen, so Sie wissen, wenn ein Strahl von der Mitte des Rechtecks schneidet rechten, oberen, linken oder unteren Rand des Rechtecks.

Wenn die Winkel ist:-atan(d/w) < alfa < atan(d/w) der Strahl schneidet die Rechte Seite des Rechtecks.Dann, da Sie wissen, dass die x-Verschiebung aus der Mitte des Rechtecks, auf der rechten Seite ist d/2 die Verschiebung dy " geteilt durch d/2 tan(alfa), so

dy = d/2 * tan(alfa)

Sie würde damit umgehen ähnlich mit den anderen drei Winkel Abständen.

Ok, hier geht.Sie haben ein Rechteck mit Breite B und Tiefe d.In der Mitte haben Sie die center point, cp.Ich nehme an, Sie möchten berechnen Sie P für verschiedene Werte der Winkel alfa.

alt text

Ich unterteilt das Rechteck in vier verschiedene Bereiche, oder der Winkel Intervallen (1 bis 4).Das Intervall, den ich oben erwähnt habe, ist das erste auf der rechten Seite.Ich hoffe, das macht Sinn für Sie.

Zuerst müssen Sie berechnen Sie den Winkel Abständen, diese werden bestimmt komplett von w und d.... Je nachdem, welchen Wert alfa hat, berechnen Sie P entsprechend, D. H.wenn die "ray" vom CP in P schneidet den oberen, unteren, rechten oder linken Rand des Rechtecks.

Cheers

Andere Tipps

Dies wurde für und überprüft auf dem Pebble Smartwatch zu arbeiten, aber modifizierte Pseudo-Code zu sein:

struct GPoint {
  int x;
  int y;
}

// Return point on rectangle edge.  Rectangle is centered on (0,0) and has a width of w and height of h
GPoint getPointOnRect(int angle, int w, int h) {
  var sine = sin(angle), cosine = cos(angle);   // Calculate once and store, to make quicker and cleaner
  var dy = sin>0 ? h/2 : h/-2;                  // Distance to top or bottom edge (from center)
  var dx = cos>0 ? w/2 : w/-2;                  // Distance to left or right edge (from center)
  if(abs(dx*sine) < abs(dy*cosine)) {           // if (distance to vertical line) < (distance to horizontal line)
    dy = (dx * sine) / cosine;                  // calculate distance to vertical line
  } else {                                      // else: (distance to top or bottom edge) < (distance to left or right edge)
    dx = (dy * cosine) / sine;                  // move to top or bottom line
  }
  return GPoint(dx, dy);                        // Return point on rectangle edge
}


Use:
rectangle_width  = 100;
rectangle_height = 150;
rectangle_center_x = 300;
rectangle_center_y = 300;
draw_rect(rectangle_center_x - (rectangle_width/2), rectangle_center_y - (rectangle_center_h/2), rectangle_width, rectangle_height);
GPoint point = getPointOnRect(angle, rectangle_width, rectangle_height);
point.x += rectangle_center_x;
point.y += rectangle_center_y;
draw_line(rectangle_center_x, rectangle_center_y, point.x, point.y);

Ein einfacher Weg, dies zu tun mit einem Winkel als parameter, um einfach clip auf die X-und Y-Werte über die Grenzen des Rechtecks.In anderen Worten, berechnen die position, als ob das Symbol dreht sich um einen kreisförmigen oder elliptischen Bahn, dann diese:

(Vorausgesetzt Achse ausgerichtet Rechteck zentriert bei (0,0), mit der X-Achse Länge der X-Achse und Y-Achse Länge der YAxis):

if (X > XAxis/2)    
         X = XAxis/2;

if (X < 0 - XAxis/2)
         X = 0 - XAxis/2;

if (Y > YAxis/2)    
         Y = YAxis/2;

if (Y < 0 - YAxis/2)    
         Y = 0 - YAxis/2;

Das problem bei diesem Ansatz ist, dass der Winkel nicht ganz genau und die Geschwindigkeit entlang des Umfangs des Rechtecks wird nicht konstant sein.Modellierung einer ellipse, die osculates das Rechteck an den Ecken können minimieren die Auswirkungen, aber wenn Sie suchen für eine glatte, Konstante Drehzahl "orbit" diese Methode wird nicht ausreichend sein.

Wenn Sie denken, dass Sie bedeuten, drehen wie die Erde um die Sonne dreht (nicht die selbst-rotation...also deine Frage ist etwa, wie auf schieben Sie entlang der Kanten eines Rechtecks?)

Wenn ja, können Sie probieren:

# pseudo coode
for i = 0 to 499
  if i < 100:  x++
  else if i < 250: y--
  else if i < 350: x--
  else y++

  drawTheIcon(x, y)

Update: (siehe Kommentar unten)

verwenden Sie einen Winkel, eine Linie

y / x = tan(th)       # th is the angle

die anderen Linien sind einfach, da Sie nur horizontal oder vertikal.so zum Beispiel, es ist x = 50 und können Sie die in der Zeile oben, die y -.tun, dass für den Schnittpunkt der horizontalen Linie und vertikalen Linie (Z. B. Winkel ist 60 Grad und es zu Schießen "NorthEast"...jetzt haben Sie zwei Punkte.Dann der Punkt, der am nächsten an der Herkunft ist das eine, trifft die erste Rechteck).

Verwenden Sie ein 2D transformation matrix.Viele Sprachen (z.B.Java) unterstützen dies nativ (look up AffineTransformation);andernfalls schreiben Sie eine routine zu tun Drehung selbst, einmal, Debuggen Sie es gut und verwenden Sie es für immer.Ich muss fünf von Ihnen, die in verschiedenen Sprachen geschrieben.

Sobald Sie tun können, die rotation einfach, finden Sie den Standort auf das Rechteck zu tun line-line intersection.Finden Sie die Mitte des umkreist Symbol von zwei sich kreuzenden Linien:

  1. Ein Strahl aus deinem Zentrum der Drehung in den Winkel, den Sie wünschen
  2. Eine der vier Seiten begrenzt von was Winkel Sie wollen (die vier Quadranten).

Zeichnen Sie sich eine Skizze auf einem Blatt Papier mit einem Rechteck und ein Drehzentrum. Zuerst übersetzen das Rechteck am Ursprung des Koordinatensystems zentriert (nicht vergessen, die Übersetzungsparameter, müssen Sie die Übersetzung später umkehren). Drehen des Rechtecks, so dass seine Seiten parallel zu den Koordinatenachsen (aus demselben Grund).

Jetzt sind Sie am Ursprung ein Dreieck mit bekannten Winkeln haben, die gegenüberliegende Seite ist von bekannter Länge (die Hälfte der Länge einer Seite des Rechtecks), und Sie können jetzt:

- löst das Dreieck

- rückgängig machen die Rotation

- rückgängig machen Übersetzung

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top