2016-05-16 10 views
1

enter image description heredie X Erhalten, Y an der Kante eines Rhombus Koordinate auf der Grundlage des Rhombus' Breite und Winkel

Ich bin ein Processing Skizze der Entwicklung gegeben, die einen bestimmten Winkel, um einen Punkt an der Kante des zieht eine Raute.

Ich kenne die Breite des Rhombus und seine Position, aber ich bin mir nicht sicher, wie man die x-y-Koordinaten eines Punktes berechnet, der an seinem Rand ruht.

Gibt es elegante Lösungen für dieses Problem? Jede Hilfe in Pseudocode wäre willkommen.

+0

Nur mit Transformationsmatrizen würde, damit Sie wissen, [Verarbeitung ist nicht das gleiche wie Java] (http://meta.stackoverflow.com/questions/321127/processing-java). – CodeMouse92

+0

Sie haben vollkommen Recht. Ich habe Java erwähnt, da Processing vielleicht nicht allen bekannt ist. – Augusto

Antwort

2

Let's quadratische Seitenlänge ist A, halbe Länge ist H = A/2. Winkel Theta. Schnittpunkt P.
Alle Koordinaten sind relativ zum Quadratmittelpunkt.

Drehen Quadrat von -Pi/4, Winkel Alpha = Theta - Pi/4

if Alpha lies in range -Pi/4..Pi/4, then intersection point P' = (H, H*Tan(Alpha)) 
if Alpha lies in range Pi/4..3*Pi/4, then P' = (H*Cotangent(Alpha), H) 
if Alpha lies in range 3*Pi/4..5*Pi/4, then P' = (-H, -H*Tan(Alpha)) 
if Alpha lies in range 5*Pi/4..7*Pi/4, then P' = (-H*Cotangent(Alpha), -H) 

drehen Dann Punkt P' zurück durch Pi/4:

S = Sqrt(2)/2 
P.X = S * (P'.X - P'.Y) 
P.Y = S * (P'.X + P'.Y) 

Beispiel (Daten wie Ihre Skizze):

A = 200, Theta = 5*Pi/12 
H = 200/2 = 100, Alpha =Theta-Pi/4 = Pi/6 
P'.X = H = 100 
P'.Y = H * Tan(Alpha) = 100 * Tan(Pi/6) ~= 57.7 

S = 0.707 
P.X = 0.707 * (100 - 57.7) = 30 
P.Y = 0.707 * (100 + 57.7) = 111 
+0

welche Notation ist P '= (H, Tan (Alpha)), P' = (Kotangens (Alpha), H) usw.? – Augusto

+0

P '= (X, Y) - gedrehter Punkt. Tan (Alpha) - Tangensfunktion. Notenbearbeitung - Multiplikation mit H wird hinzugefügt – MBo

2

Basierend auf Ihrem Bild möchten Sie den Schnittpunkt zweier Gleichungen finden, nämlich die der Linie im Winkel θ und die der Seite des Quadrats, mit der sie sich schneidet.

Unter der Annahme, dass die Größe Ihres Quadrats n ist, ist die Gleichung des Quadrats y=±(n*(√2/2))±x (nach Pythagoras 'Theorem). Die Gleichung für die Seite, die Sie in Ihrem Bild schneiden, lautet y=n*(√2/2)-x.

Die Gleichung der Radiallinie kann unter Verwendung der Trigonometrie als y=tan(θ)*x berechnet werden, wobei θ in Radianten ausgedrückt wird.

Sie können dies als simultaneous equation lösen, um die Kreuzung zu bestimmen. Bitte beachten Sie, dass es sich mit beiden Seiten des Quadrats schneidet (sowohl oben als auch unten). Wenn Sie also nur das eine wollen, müssen Sie die Gleichung für die richtige Seite des Quadrats wählen. Berücksichtigen Sie auch den Fall, in dem θ π/2 ist, da tan (π/2) undefiniert ist. Sie können diesen Fall leicht herausfinden, da x = 0 und so wird es immer bei y=±(n*(√2/2)) schneiden. In Ihrem Beispiel tritt der Schnittpunkt auf, wenn x*(1+tan(θ))=n*(√n/n) oder x=(n*(√n/n))/(1+tan(θ)). Sie können das berechnen, stecken Sie es wieder in y und das ist Ihre (x, y) Kreuzung.

1

ein Imagine Kreis mit einem großen Radius, der Ihre Raute an den gewünschten Punkten schneidet. Eine Möglichkeit, an dieser Position zu zeichnen, besteht darin, ein verschachteltes Koordinatensystem zu verwenden, das Sie übersetzen und drehen. Alles, was Sie wissen müssen, ist der Radius und der Winkel.

Hier ist ein sehr einfaches Beispiel:

float angle = radians(-80.31); 
float radius = 128; 

float centerX,centerY; 
void setup(){ 
    size(320,320); 
    noFill(); 
    rectMode(CENTER); 

    centerX = width * 0.5; 
    centerY = height * 0.5; 
} 
void draw(){ 
    background(255); 
    noFill(); 
    //small circle 
    strokeWeight(1); 
    stroke(95,105,120); 
    ellipse(centerX,centerY,210,210); 
    rhombus(centerX,centerY,210); 
    //large circle 
    strokeWeight(3); 
    stroke(95,105,120); 
    ellipse(centerX,centerY,radius * 2,radius * 2); 

    //line at angle 
    pushMatrix(); 
    translate(centerX,centerY); 
    rotate(angle); 
    stroke(162,42,32); 
    line(0,0,radius,0); 
    popMatrix(); 

    //debug 
    fill(0); 
    text("angle: " + degrees(angle),10,15); 
} 
void rhombus(float x,float y,float size){ 
    pushMatrix(); 
    translate(x,y); 
    rotate(radians(45)); 
    rect(0,0,size,size); 
    popMatrix(); 
} 
void mouseDragged(){ 
    angle = atan2(centerY-mouseY,centerX-mouseX)+PI; 
} 

Sie eine Demo hier versuchen können (Sie die Maus ziehen um den Winkel zu ändern):

var angle; 
 
var radius = 128; 
 

 
var centerX,centerY; 
 
function setup(){ 
 
    createCanvas(320,320); 
 
    noFill(); 
 
    rectMode(CENTER); 
 
    
 
    angle = radians(-80.31); 
 
    centerX = width * 0.5; 
 
    centerY = height * 0.5; 
 
} 
 
function draw(){ 
 
    background(255); 
 
    noFill(); 
 
    //small circle 
 
    strokeWeight(1); 
 
    stroke(95,105,120); 
 
    ellipse(centerX,centerY,210,210); 
 
    rhombus(centerX,centerY,210); 
 
    //large circle 
 
    strokeWeight(3); 
 
    stroke(95,105,120); 
 
    ellipse(centerX,centerY,radius * 2,radius * 2); 
 
    
 
    //line at angle 
 
    push(); 
 
    translate(centerX,centerY); 
 
    rotate(angle); 
 
    stroke(162,42,32); 
 
    line(0,0,radius,0); 
 
    pop(); 
 
    
 
    //debug 
 
    fill(0); 
 
    noStroke(); 
 
    text("angle: " + degrees(angle),10,15); 
 
} 
 
function rhombus(x,y,size){ 
 
    push(); 
 
    translate(x,y); 
 
    rotate(radians(45)); 
 
    rect(0,0,size,size); 
 
    pop(); 
 
} 
 
function mouseDragged(){ 
 
    angle = atan2(centerY-mouseY,centerX-mouseX)+PI; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.0/p5.min.js"></script>

Wenn Sie Möchten Sie die Position berechnen, können Sie die Umwandlungsformel für die kartesische Koordinate verwenden:

x = cos(angle) * radius 
y = sin(angle) * radius 

Hier ist ein Beispiel, das das verwendet. Beachten Sie, dass Zeichnung vom Zentrum erfolgt, deshalb werden die Mittelpunktskoordinaten der obigen hinzugefügt:

float angle = radians(-80.31); 
float radius = 128; 

float centerX,centerY; 
void setup(){ 
    size(320,320); 
    noFill(); 
    rectMode(CENTER); 

    centerX = width * 0.5; 
    centerY = height * 0.5; 
} 
void draw(){ 
    background(255); 
    noFill(); 
    //small circle 
    strokeWeight(1); 
    stroke(95,105,120); 
    ellipse(centerX,centerY,210,210); 
    rhombus(centerX,centerY,210); 
    //large circle 
    strokeWeight(3); 
    stroke(95,105,120); 
    ellipse(centerX,centerY,radius * 2,radius * 2); 

    //line at angle 
    float x = centerX+(cos(angle) * radius); 
    float y = centerX+(sin(angle) * radius); 
    stroke(162,42,32); 
    line(centerX,centerY,x,y); 

    //debug 
    fill(0); 
    text("angle: " + degrees(angle),10,15); 
} 
void rhombus(float x,float y,float size){ 
    pushMatrix(); 
    translate(x,y); 
    rotate(radians(45)); 
    rect(0,0,size,size); 
    popMatrix(); 
} 
void mouseDragged(){ 
    angle = atan2(centerY-mouseY,centerX-mouseX)+PI; 
} 

Eine weitere Option