¿Cómo podría trazar una curva cuadrática o una curva trigonométrica (como sin(x)
) en un Canvas
?Dibuja una ruta curva en Canvas?
Respuesta
mayoría de las API de dibujo no proporcionan tales funciones, se tendrá que calcular los píxeles de la curva deseada en píxeles y dibujar pieza por pieza en el lienzo con una o más llamadas a la API de canvas.
voy a suponer que usted está familiarizado con el trazado de líneas básicas en un lienzo, si no, entonces responder de nuevo y podemos profundizar más atrás. Sin embargo, en cuanto a dibujar una función sinusoidal, hay una función dentro de la clase Math que tiene justo lo que necesita. http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Math.html#sin%28double%29 A partir de ahí sólo tiene que pasar la variable x (en radianes) en la función y guardar su salida como una variable y. Esto representa un punto en tu gráfica. Ahora incremente la variable x1 en una pequeña cantidad (tal vez 1/100 de su gráfica, aunque necesitará ajustar esto para probarla), ejecútela nuevamente a través de la función y guarde esas variables (x2 e y2) como su segundo punto. Dibuja una línea entre estos dos puntos. Guarde sus variables x2, y2 como x1, y1 e incremente su valor de x nuevamente para encontrar el tercer punto, y así sucesivamente. Esta no es una curva "verdadera", ya que en realidad es solo una serie de líneas que se aproximan a la función, un enfoque de cálculo si se quiere.
Así:
x1 = x; // donde x es un punto en el eje x en el que te gustaría empezar a graficar.
y1 = sin (x);
x2 = x1 + incremento;
y2 = sin (x2);
// Dibujar una línea aquí
x1 = x2; y1 = y2;
// volver al principio, este código estaría obviamente en un bucle en el que se usa el incremento como su propio incremento, siendo el valor inicial igual a la cantidad que desea incrementar cada vez (digamos ... 5) y la instrucción "siguiente" es increment = increment + 5.
También hay una clase GraphCanvas con la que no estoy familiarizado, que parece tomar esos mismos puntos y dibujar la curva entre ellos, aunque no estoy seguro de qué tipo de transformación se está utilizando para dibujar la curva y qué tan precisa es. Aquí está la clase: http://www.java2s.com/Code/Java/Swing-Components/GraphCanvas.htm
Utilice Canvas.drawPath
y Path.quadTo
.
Aquí es un método drawEquation() que escribí para una clase Gráfico - Creo que puede ayudar. La idea básica para crear un método que acepta una ecuación (que es básicamente una función) como
function(x) = Math.sin(x);
y luego bucle a través de los límites del gráfico y señala a pequeños segmentos que conectan cada punto. El transformContext() simplemente invierte el contexto de la lona para que los valores crecientes de y van hacia arriba y no hacia abajo:
Graph.prototype.transformContext = function(){
var canvas = this.canvas;
var context = this.context;
// move context to center of canvas
this.context.translate(this.centerX, this.centerY);
// stretch grid to fit the canvas window, and
// invert the y scale so that that increments
// as you move upwards
context.scale(this.scaleX, -this.scaleY);
};
Graph.prototype.drawEquation = function(equation, color, thickness){
var canvas = this.canvas;
var context = this.context;
context.save();
this.transformContext();
context.beginPath();
context.moveTo(this.minX, equation(this.minX));
for (var x = this.minX + this.iteration; x <= this.maxX; x += this.iteration) {
context.lineTo(x, equation(x));
}
context.restore();
context.lineJoin = "round";
context.lineWidth = thickness;
context.strokeStyle = color;
context.stroke();
};
Al igual que usted, que tenía que dibujar una línea curva desde point(x1, y1)
a point (x2, y2)
. Hice algunas búsquedas que me llevan a la clase Path (android.graphics.Path
). Path tiene numerosos métodos para dibujar líneas.Una vez que haya creado una ruta, use un método de dibujo para hacer la línea real. Las rutas se pueden rotar, transformar, guardar y agregar a. También hay arcos, círculos y rectángulos que se dibujan con esta clase.
http://developer.android.com/reference/android/graphics/Path.html
Conjunto punto de inicio de la ruta camino → mPath.moveTo(x1, y1);
Establecer puntos constantes y final → mPath.quadTo(cx, cy, x2, y2);
Convertir a línea → canvas.drawPath(mPath, mPaint);
- 1. Mueve un div en una ruta curva (como la interpolación en Flash en los viejos tiempos)?
- 2. lienzo no dibuja en vista personalizada
- 3. Cómo mover una vista a lo largo de una ruta curva en iOS
- 4. .animate con una curva
- 5. Iterativamente suavizar una curva
- 6. A * Iniciar búsqueda de ruta en HTML5 Canvas
- 7. ¿Cómo calcular el punto más cercano de una línea y curva? .. o curva y curva?
- 8. Dibuja hyperplane en R?
- 9. HowTo: Dibuja una línea con una flecha?
- 10. ¿Cómo se dibuja una ruta usando diferentes valores de latitud larga?
- 11. Posibilidad de una galería curva
- 12. Cómo puedo obtener todos los puntos en la curva CGPath o la curva cuádruple
- 13. Animación En una ruta con rotación automática basada en la ruta en android
- 14. Mover un objeto en una trayectoria de curva de Bézier
- 15. ¿Cómo dibujar NSString en una trayectoria curva?
- 16. Ajusta una curva SVG a un polinomio
- 17. Convertir curva cuadrática a curva cúbica
- 18. CGContextDrawImage in Retina dibuja una imagen pixelada?
- 19. HTML5 Canvas y Anti-aliasing
- 20. Curva de Curva cúbica: ¿Reducción máxima de gradiente y colisión?
- 21. Creando una curva spline entre 2 puntos en Three.js
- 22. ¿Cómo usar la curva de función en [R] para graficar una curva normal?
- 23. Uso del dispatchDraw (Canvas canvas)
- 24. ¿Cómo se dibuja una cuadrícula en un diagrama en Python?
- 25. Dibuja un semicírculo lleno
- 26. ¿Diseña/dibuja/dibuja primero una solución de desarrollo y luego la desarrolla? ¿Si es así, cómo?
- 27. HTML5 canvas múltiple en una sola página
- 28. Dibuje una línea curva en una página web mientras el usuario se desplaza
- 29. OpenGL: glDrawElements no dibuja
- 30. iPhone/iPad HTML5 Canvas fillText problema