Un breve background: sto lavorando a un'applicazione di disegno basata sul web e ho bisogno di disegnare spline di 1px che passano attraverso i loro punti di controllo.Spline alias di disegno, pixel perfetti 1px (Catmull-Rom, in particolare)
Il problema con cui sto lottando è che devo disegnare ciascuno dei pixel tra p1 e p2 come se stessi usando uno strumento a matita 1px. Quindi, nessun anti-aliasing e un pixel alla volta. Questo deve essere fatto manualmente senza l'uso di alcun codice di libreria linea/curva poiché il mio sistema di pennelli dipende dall'avere una coordinata di pixel per applicare la punta del pennello al canvas.
In sostanza, ho bisogno di combinare il passaggio di un pixel da qualcosa come l'algoritmo di Bresenham con le coordinate restituite dall'equazione Catmull-Rom. Sto avendo problemi perché i punti Catmull-Rom non sono distribuiti in modo uniforme (quindi non posso dire solo che ci dovrebbero essere 100 pixel nella curva ed eseguire l'equazione 100 volte). Ho provato ad utilizzare un valore iniziale stimato del massimo dei delta X e Y e riempire gli spazi vuoti con Bresenham, ma a causa dell'arrotondamento finisco comunque con alcune sezioni "sporche" (cioè la linea si sta chiaramente spostando verso l'alto e verso il giusto ma ottengo ancora due pixel con lo stesso componente Y, risultando in una sezione "grossa" della linea).
Sono sicuro che questo è stato risolto perché quasi tutti i programmi di grafica che disegnano le spline devono supportare le curve di pixel pulite che sto cercando. Dopo un bel po 'di ricerca matematica, però, sono un po' confuso e ancora senza una soluzione. Qualche consiglio?
EDIT: Ecco un esempio di una curva che potrei avere a rendere:
che potrebbero avere un risultato atteso simile a questo (si noti che si tratta di una stima):
Utilizzando l'equazione spline Catmull-Rom, sono necessari quattro punti per creare un segmento. P0 e P3 sono usati come tangenti per la direzione di entrata e uscita dal segmento P1-> P2. Con una spline Catmull-Rom, la sezione blu è tutto ciò che viene interpolato quando t si sposta da 0 a 1. P0 e P3 possono essere duplicati per garantire che la porzione verde venga sottoposta a rendering, quindi non è un problema per me.
Per semplicità, ho bisogno di rendere i pixel sulla curva tra P1 e P2, dato che ho tangenti in forma di P0 e P3. Non ho necessariamente bisogno di usare le spline di Catmull-Rom, ma sembrano essere lo strumento giusto per questo compito, dato che i punti di controllo devono essere passati. La distribuzione non uniforme dei punti di interpolazione è ciò che mi sta gettando per un ciclo.
EDIT2: Ecco un esempio di ciò che intendo quando dico la mia curva risultante è sporca:
Le frecce rosse indicano alcuni luoghi dove non ci dovrebbe essere un pixel. Ciò si verifica perché le componenti X e Y delle coordinate calcolate non cambiano alla stessa velocità. Quindi, quando ognuno dei componenti viene arrotondato (quindi ho una posizione esatta dei pixel), è possibile che X o Y non vengano caricati perché la coordinata calcolata è, ad esempio, (42.4999, 50.98). Scambiare il round per un piano o ceil non risolve il problema, poiché cambia solo dove si verifica.
Sarebbe fantastico se fosse possibile aggiungere un altro disegno che mostra il risultato atteso da P1 a P2. –
@belisarius Non ho calcolato la matematica per cui i pixel sarebbero stati compilati in base all'equazione Catmull-Rom, ma la seconda immagine dovrebbe darti un'idea di cosa sto cercando di ottenere. – Xenethyl
L'ho chiesto a causa del tuo commento: _ma ancora ottengo due pixel con lo stesso componente Y_ –