Wie kann man ein Grafikobjekt von einem Punkt in einen anderen übersetzen, ohne es zu modifizieren?

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

  •  26-10-2019
  •  | 
  •  

Frage

Ich versuche viele Stunden, einen mathematischen Weg (eine Sündewelle) von einer Koordinatenposition in eine andere zu übersetzen. Aber entweder ich bin dumm oder etwas schief.

Ich habe das versucht

    // Translate 
    for (int i=0; i < 300; i++) {
        coordinatesX[i] = coordinatesX[i] + ( 80 - coordinatesX[i]);
        coordinatesY[i] = coordinatesY[i] + (100 - coordinatesY[i]);
    }

Wo 80 und 100 die neue Koordinatenposition sind, in die ich mein Objekt übersetzen möchte. Ich habe das versucht

    // Translate 
    for (int i=0; i < 300; i++) {
        coordinatesX[i] = coordinatesX[i] + 80;
        coordinatesY[i] = coordinatesY[i] + 100;
    }

Aber alles scheint teilweise zu funktionieren oder zu funktionieren, nur wenn die Welle einen Winkel hat? Ich glaube, mir fehlte in der Schule Mathematik. Ich programmiere in Java mit dem Andengine. Möglicherweise gibt es einige Abkürzungen zu dieser Elementar -Funktion.

Der gesamte Code:

    // define newpath
    float[] coordinatesX = new float[300]; 
    float[] coordinatesY = new float[300];
    // wave
    for (int i=0; i<300; i++){
        coordinatesX[i] =  i;
        coordinatesY[i] = (float)(20 * (Math.sin((-0.10 * coordinatesX[i]))));
        System.out.println(coordinatesX[i]);
        System.out.println(coordinatesY[i]);
        //coordinatesX[i] = coordinatesX[i] + centerX;
        //coordinatesY[i] = coordinatesX[i]+centerY;
    }


    // ROtate 
    for (int i=0; i<300; i++){
        coordinatesX[i] = ((coordinatesX[i] * (float)Math.cos(-10)) - (coordinatesY[i] * (float)Math.sin(-10))) + coordinatesX[i];
        coordinatesY[i] = (coordinatesX[i] * (float)Math.sin(-10)) + (coordinatesY[i] * (float)Math.cos(-10)) + coordinatesY[i];
    }

    // Translate 
    for (int i=0; i < 300; i++) {
        coordinatesX[i] = coordinatesX[i]+ (200);
        coordinatesY[i] = coordinatesY[i] + (300);
    }
War es hilfreich?

Lösung

Hier ist ein Beispiel dafür, wie man eine Sinuswelle übersetzt. Passen Sie es nach Ihren Bedürfnissen an.

package math;

import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;

/**
 * Curve translation example
 * User: Michael
 * Date: 1/10/12
 * Time: 7:56 PM
 */
public class TranslationExample {
    public static void main(String[] args) {
        double length = 1.0;
        int numPoints = 20;       
        List<Point2D.Double> curve = getCurve(length, numPoints);
        System.out.println("before translation");
        for (Point2D.Double point : curve) {
            System.out.printf("%10.6f %10.6f\n", point.getX(), point.getY());
        }
        Point2D.Double delta = new Point2D.Double(3.0, 4.0);
        curve = translateCurve(curve, delta);
        System.out.println("after  translation");
        for (Point2D.Double point : curve) {
            System.out.printf("%10.6f %10.6f\n", point.getX(), point.getY());
        }
    }

    private static List<Point2D.Double> translateCurve(List<Point2D.Double> curve, Point2D.Double delta) {
        List<Point2D.Double> translated = new ArrayList<Point2D.Double>();

        for (Point2D.Double point : curve) {
            translated.add(new Point2D.Double(point.getX()+delta.getX(), point.getY()+delta.getY()));
        }
        return translated;
    }

    private static List<Point2D.Double> getCurve(double length, int numPoints) {
        List<Point2D.Double> points = new ArrayList<Point2D.Double>();
        if ((length > 0.0) && (numPoints > 0)) {
            double dx = length / numPoints;
            double x = 0.0;
            for (int i = 0; i < (numPoints - 1); ++i) {
                points.add(new Point2D.Double(x, Math.sin(2.0*Math.PI*x/length)));
                x += dx;
            }
            points.add(new Point2D.Double(length, Math.sin(2.0*Math.PI)));
        }

        return points;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top