Sto usando CoreGraphics per disegnare un bezier quadratico ma voglio computer il valore minimo/massimo della curva. Non sono di origine matematica, quindi è diventato un po 'fastidioso. Qualcuno ha articoli o idee su come risolvere questo?Ricerca di min/max di bezier quadratico con CoreGraphics
risposta
Per un Bezier quadratica, questo è in realtà abbastanza semplice.
Definire i tre punti di controllo come P0 = (x0,y0)
, P1 = (x1,y1)
e P2 = (x2,y2)
. Per trovare gli estremi in x
, risolvere questa equazione:
t = (x0 - x1)/(x0 - 2*x1 + x2)
Se 0 <= t <= 1
, quindi valutare la curva a t
e memorizzare la posizione come Px
. Fate la stessa cosa per il y
:
t = (y0 - y1)/(y0 - 2*y1 + y2)
Anche in questo caso, se 0 <= t <= 1
, valutare la vostra curva t
e memorizzare la posizione come Py
. Infine, trova il riquadro di delimitazione allineato all'asse contenente P0
, P2
, Px
(se trovato) e Py
(se trovato). Questo riquadro di delimitazione vincolerà anche la curva quadratica di Bezier 2D.
Calcolo fornisce la casella standard di trucchi per trovare il minimo/massimo di curve continue e differenziabili.
Ecco una discussione di esempio:
http://newsgroups.derkeiler.com/Archive/Comp/comp.graphics.algorithms/2005-07/msg00334.html
ho fatto una rappresentazione di questo in 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. C ricerca # minmax grafico
- 2. Disegno di una freccia su un segmento Bezier quadratico utilizzando xaml
- 3. Normalizzazione MinMax in scala
- 4. Confronto di std :: minmax in coppia
- 5. Disegno in CATiledLayer con CoreGraphics CGContextDrawImage
- 6. Curva di Bezier e tela
- 7. Domanda sull'implementazione di Bezier Curves?
- 8. CoreGraphics per display retina
- 9. CoreGraphics FillPath e tracciato percorso
- 10. Osservazione del comportamento strano con 'auto' e std :: minmax
- 11. confronto Float (uguaglianza) in CoreGraphics
- 12. In che modo l'unione trova l'algoritmo quadratico?
- 13. Errore quadratico medio in Numpy?
- 14. Come animare il disegno di forma di CoreGraphics usando CAKeyframeAnimation
- 15. Animazione tra due forme di percorso Bezier
- 16. Bezier curve cubiche: muove con accelerazione uniforme
- 17. Curva quadratica di Bezier: Calcola tangente
- 18. Trascina una curva di Bezier per modificarla
- 19. Osservazione del comportamento quadratico con quicksort - O (n^2)
- 20. Ricerca di "." con string.find()
- 21. Radice errore quadratico medio in R - modello di effetto misto
- 22. Statistiche python modelli - termine quadratico in regressione
- 23. iOS Quartz/CoreGraphics disegno pennellata sfumata
- 24. Ricerca di quiescenza di scacchi è troppo estesa
- 25. CoreGraphics - Blending only * part * of a view
- 26. Uso di una curva di Bezier per disegnare una spirale
- 27. Rilevamento di autotransferimento in curve chiuse di Bezier
- 28. Come disegnare la curva di Bezier di diversi punti?
- 29. testo pareggio utilizzando CoreGraphics in iphone
- 30. Objective C Bezier Curve ReShaping
'P1 = (x2, y2)' in principio è un errore di battitura, giusto? – kangax
Grazie kangax. Risolto il problema di battitura. – Naaff