Pregunta

Estoy intentando durante muchas horas traducir un camino matemático (una ola de pecado) de una posición de coordenada a otra ... pero soy estúpido o algo sale mal.

Intenté esto

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

Donde 80 y 100 son la nueva posición de coordenada a la que quiero traducir mi objeto. Intenté esto

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

¿Pero todo parece funcionar o funcionar parcialmente solo si la onda tiene algún ángulo? Creo que me faltaba algunas matemáticas en la escuela. Estoy programando en Java usando el AndEngine. Puede haber algunos atajos en esta función elemental.

Todo el código:

    // 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);
    }
¿Fue útil?

Solución

Aquí hay un ejemplo de cómo traducir una ola sinusoidal. Adaptarlo de acuerdo con sus necesidades.

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;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top