¿Cómo traducir un objeto gráfico de un punto a otro sin modificarlo?
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);
}
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