Estoy usando CoreGraphics para dibujar un bezier cuadrático pero quiero computarizar el valor mínimo/máximo de la curva. No soy de origen matemático, así que esto se ha vuelto un poco problemático. ¿Alguien tiene algún artículo o idea sobre cómo resolver esto?Encontrar min/max de bezier cuadrático con CoreGraphics
Respuesta
Para una Bézier cuadrática, esto es en realidad bastante simple.
Defina sus tres puntos de control como P0 = (x0,y0)
, P1 = (x1,y1)
y P2 = (x2,y2)
. Para encontrar los valores extremos en x
, resolver esta ecuación:
t = (x0 - x1)/(x0 - 2*x1 + x2)
Si 0 <= t <= 1
, a continuación, evaluar su curva en t
y almacenar la ubicación como Px
. Hacer lo mismo para y
:
t = (y0 - y1)/(y0 - 2*y1 + y2)
De nuevo, si 0 <= t <= 1
, evaluar su curva en t
y almacenar la ubicación como Py
. Finalmente, busque el cuadro delimitador alineado con el eje que contiene P0
, P2
, Px
(si se encuentra) y Py
(si se encuentra). Este cuadro delimitador también vinculará estrechamente su curva de Bezier cuadrática 2D.
Cálculo proporciona la caja estándar de trucos para encontrar el mínimo/máximo de curvas continuas y diferenciables.
Aquí es una discusión de la muestra:
http://newsgroups.derkeiler.com/Archive/Comp/comp.graphics.algorithms/2005-07/msg00334.html
he hecho una representación de esta en javascript:
function P(x,y){this.x = x;this.y = y; }
function pointOnCurve(P1,P2,P3,t){
if(t<=0 || 1<=t || isNaN(t))return false;
var c1 = new P(P1.x+(P2.x-P1.x)*t,P1.y+(P2.y-P1.y)*t);
var c2 = new P(P2.x+(P3.x-P2.x)*t,P2.y+(P3.y-P2.y)*t);
return new P(c1.x+(c2.x-c1.x)*t,c1.y+(c2.y-c1.y)*t);
}
function getQCurveBounds(ax, ay, bx, by, cx, cy){
var P1 = new P(ax,ay);
var P2 = new P(bx,by);
var P3 = new P(cx,cy);
var tx = (P1.x - P2.x)/(P1.x - 2*P2.x + P3.x);
var ty = (P1.y - P2.y)/(P1.y - 2*P2.y + P3.y);
var Ex = pointOnCurve(P1,P2,P3,tx);
var xMin = Ex?Math.min(P1.x,P3.x,Ex.x):Math.min(P1.x,P3.x);
var xMax = Ex?Math.max(P1.x,P3.x,Ex.x):Math.max(P1.x,P3.x);
var Ey = pointOnCurve(P1,P2,P3,ty);
var yMin = Ey?Math.min(P1.y,P3.y,Ey.y):Math.min(P1.y,P3.y);
var yMax = Ey?Math.max(P1.y,P3.y,Ey.y):Math.max(P1.y,P3.y);
return {x:xMin, y:yMin, width:xMax-xMin, height:yMax-yMin};
}
- 1. Dibujar una flecha en un segmento de Bezier cuadrático usando xaml
- 2. ¿Hay una implementación C++ MinMax Heap?
- 3. recorte de Bezier
- 4. Cómo dibujar un arco elíptico con CoreGraphics?
- 5. Observación del comportamiento cuadrático con quicksort - O (n^2)
- 6. Fondo transparente en CoreGraphics
- 7. CoreGraphics FillPath And Stroke Path
- 8. iOS: procesamiento de imágenes de 2 pasos con CoreGraphics
- 9. comparación flotador (igualdad) en CoreGraphics
- 10. Puntos equidistantes en curvas Bezier
- 11. bezier path widening
- 12. convertir curva de bezier a cadena poligonal?
- 13. Curva y lienzo de Bezier
- 14. CoreGraphics de pantalla de la retina
- 15. ¿Dibujando curvas de bezier con mi dedo en iOS?
- 16. Objetivo C Bezier Curva Reesformar
- 17. ¿Cómo puedo dibujar un semicírculo usando CoreGraphics
- 18. ¿Algún algoritmo para encontrar el cuadro delimitador de curvas de bezier cerradas?
- 19. Arrastre una curva bezier para editarlo
- 20. Recreación de transiciones CSS3 Curva cúbica-Bezier
- 21. ¿Qué es diferente entre CoreGraphics y CoreAnimation?
- 22. texto sorteo utilizando CoreGraphics en iPhone
- 23. Pregunta sobre la implementación de Bezier Curves?
- 24. ¿Cómo compensar una curva de bezier cúbica?
- 25. Curva de Bezier cuadrática: Calcular la tangente
- 26. Encontrar puntos en una curva bezier basada en la distancia desde otro punto
- 27. Curvas rotas en Html5 Lienzo Bezier
- 28. Aproximación del bezier cúbico no paramétrico
- 29. Ángulo de un punto dado en una curva de Bezier?
- 30. Cómo animar a CoreGraphics Dibujo de forma mediante CAKeyframeAnimation
'P1 = (x2, y2)' en un principio es un error tipográfico, ¿verdad? – kangax
Gracias kangax. Se corrigió el error tipográfico. – Naaff