2010-05-25 11 views
6

Come posso simulare una vernice spray simile a quella di Windows? penso che crei punti casuali, qual è la tua opinione?Simulare uno spray

+0

Si tratta di creare uno spray utilizzando C# in modo specifico? In caso contrario, perché questo taggato "C#"? –

+0

Sì, si tratta di creare uno spray in C# –

+0

Opere per me, quindi. A volte è un po 'di confusione quando una domanda ha un tag, ma la domanda reale sembra molto generica e in realtà non menziona alcuna relazione con il tag. Grazie, Hesam. –

risposta

5

Sì, direi che colora i pixel casuali all'interno di un certo raggio del punto di selezione. Probabilmente c'è anche un intervallo di tempo tra la colorazione di un pixel e l'altro, perché le macchine oggi sono abbastanza veloci da poter colorare ogni pixel possibile (purché il raggio sia piccolo) prima di poter rilasciare il pulsante del mouse.

Inoltre, penso che l'algoritmo utilizzato da Paint possa selezionare un pixel da dipingere anche se è già stato dipinto, poiché a volte si può finire con un cerchio dipinto con all'interno pochi pixel non verniciati.

+0

'Probabilmente c'è anche un intervallo di tempo tra la colorazione di un pixel e l'altro - Dipinge solo se il mouse si è spostato da un fotogramma all'altro. –

+1

@BlueRaja, ho appena aperto mspaint e ho tenuto premuto il pulsante del mouse. Il cerchio si riempì lentamente senza che il mio mouse si muovesse. FYI. –

+0

Inoltre, tieni presente che spruzza con un fattore di trasparenza. E se un pixel viene spruzzato su un altro pixel, la trasparenza diventerà più opaca. Well Paint non lo fa, ma Photoshop lo fa – Icemanind

-1

Penso che sia difficile trovare un esempio su C#. Di seguito vi presento un modo per iniziare il vostro viaggio su questo. Qui sto usando un pennello texture.

private void Button1_Click(System.Object sender, System.EventArgs e) 
{ 
    try 
    { 
     Bitmap image1 = (Bitmap)Image.FromFile(@"C:\temp\mybrush.bmp", true); 

     TextureBrush t = new TextureBrush(image1); 
     t.WrapMode = System.Drawing.Drawing2D.WrapMode.Tile; 
     Graphics formGraphics = this.CreateGraphics(); 
     formGraphics.FillEllipse(t, new RectangleF(90.0F, 110.0F, 100, 100)); 
     formGraphics.Dispose(); 

    } 
    catch (System.IO.FileNotFoundException) 
    { 
     MessageBox.Show("Image file not found!"); 
    } 

} 

come ha detto Jesse, penso che dovresti trovare un algoritmo per distribuire i pixel casuali.

3

Il motivo per la vernice spray sarebbe semi-casuale. Se tiri fuori una lattina di Krylon e ne spruzzi lentamente una linea su un muro, ti ritroverai con una linea ampia e larga che sfuma sullo sfondo con un gradiente lungo i bordi. Spruzzare in un punto per dieci secondi e si ottiene un punto grande al centro in cui il colore è completamente saturo, con una sfumatura radiale sullo sfondo.

So- le variabili per la simulazione includono:

  • tempo di mantenimento della "spruzzatore" (pulsante del mouse)
  • movimento del "può" (mouse)
  • Velocità del "può" (le mosse veloci formano una linea leggera e non saturata, le mosse lente formano una linea spessa e satura con un gradiente)
  • motivo di dispersione: lo spray è focalizzato come un aerografo, o grande come una bomboletta spray?
  • "Distanza": quanto distare lo "spruzzatore" dalla "tela"?
2

Hai ricevuto un numero di risposte che ti indirizzano nella giusta direzione per iniziare a gestire l'esperienza utente dell'effetto spray. In base alla tua risposta al mio commento, hai anche bisogno di un algoritmo per generare i punti casuali all'interno del raggio.

Ci sono diversi modi per farlo, e probabilmente il più ovvio sarebbe utilizzare polar coordinates per selezionare il punto casuale e quindi trasformare la coordinata polare in una coordinata cartesiana (x, y) per renderizzare il pixel. Ecco un semplice esempio di questo approccio. Per mantenere le cose semplici, ho appena disegnato una semplice ellisse 1x1 per ogni punto.

private Random _rnd = new Random(); 
private void Form1_MouseDown(object sender, MouseEventArgs e) 
{  
    int radius = 15; 

    using (Graphics g = this.CreateGraphics()) 
    { 
    for (int i = 0; i < 100; ++i) 
    { 
     // Select random Polar coordinate 
     // where theta is a random angle between 0..2*PI 
     // and r is a random value between 0..radius 
     double theta = _rnd.NextDouble() * (Math.PI * 2); 
     double r = _rnd.NextDouble() * radius; 

     // Transform the polar coordinate to cartesian (x,y) 
     // and translate the center to the current mouse position 
     double x = e.X + Math.Cos(theta) * r; 
     double y = e.Y + Math.Sin(theta) * r; 

     g.DrawEllipse(Pens.Black, new Rectangle((int)x - 1, (int)y - 1, 1, 1)); 
    } 
    } 
} 

In alternativa, è possibile selezionare casualmente coordinate x, y del rettangolo che si inserisce il cerchio spruzzo e con il cerchio equazione r^2 = x^2 + y^2 prova punto per determinare se esso si trova all'interno il cerchio, se si seleziona a caso un altro punto e testare di nuovo fino ad avere un punto che si trova all'interno del cerchio. Ecco un breve esempio di questo approccio

private Random _rnd = new Random(); 
private void Form1_MouseDown(object sender, MouseEventArgs e) 
{  
    int radius = 15; 
    int radius2 = radius * 2; 

    using (Graphics g = this.CreateGraphics()) 
    { 
    double x; 
    double y; 

    for (int i = 0; i < 100; ++i) 
    {   
     do 
     { 
     // Randomy select x,y so that 
     // x falls between -radius..radius 
     // y falls between -radius..radius 
     x = (_rnd.NextDouble() * radius2) - radius; 
     y = (_rnd.NextDouble() * radius2) - radius; 

     // If x^2 + y^2 > r2 the point is outside the circle 
     // and a new point needs to be selected 
     } while ((x*x + y*y) > (radius * radius)); 

     // Translate the point so that the center is at the mouse 
     // position 
     x += e.X; 
     y += e.Y; 

     g.DrawEllipse(Pens.Black, new Rectangle((int)x - 1, (int)y - 1, 1, 1)); 
    } 
    } 
} 
0

È possibile creare un modello di spruzzo di varie intensità tramite campionamento qualche numero (in relazione alla intensità desiderata e diffondere) di coordinate polari.Per fare questo, determinare un coordiate casuale polare (ρ, θ) per ogni campione da:

ρ campionato da N (0, 1): Utilizzare un Normal (Gaussian) distribution per la distanza dal centro esatto del modello di spruzzo. Non ricordo se esiste un normale generatore di variate nella libreria .NET. Se non c'è, puoi create one from a U(0, 1) generator.

θ campionata da U (0, π): Esempio il componente angolare dal Uniform Continuous Distribution. Senza perdita di prestazioni o generalità, si può invece gustare su U (n π, m π) per n < m, ma U (0, π) sarà probabilmente bene per quello che ti serve.

Le coordinate cartesiane di ciascun campione sono invia da (T x + S x ρ cos θ, T y + S y ρ sin θ) dove (T x, T y) è il centro del motivo di spruzzo che si desidera creare; S x e S y sono i fattori di spread che si desidera avere rispettivamente nelle direzioni xey.

0

provare a utilizzare il timer di

public partial class Form1 : Form 
{ 
    int Radious = 5; 
    Random _rnd = new Random(); 
    Timer T = new Timer(); 
    int InterVal = 1000; 
    MouseEventArgs MEA = null; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     T.Tick += (O, E) => 
     { 
      StartSpray(); 
     }; 
     this.MouseDown += (O, E) => 
     { 
      MEA = E; 
      T.Interval = InterVal; 
      T.Start(); 

     }; 
     this.MouseUp += (O, E) => 
     { 
      T.Stop(); 
     }; 
    } 
    private void StartSpray() 
    { 
     Point P = DrawPoint(Radious, MEA.X, MEA.Y); 
     // Draw the point on any graphics area you can add the color or anything else 
    } 
    private Point DrawPoint(int Radious, int StatX, int StartY) 
    { 
     double theta = _rnd.NextDouble() * (Math.PI * 2); 
     double r = _rnd.NextDouble() * Radious; 
     Point P = new Point { X = StatX + Convert.ToInt32(Math.Cos(theta) * r), Y = StartY + Convert.ToInt32(Math.Sin(theta) * r) }; 
     return P; 
    }  
} 

si prega di modificare l'intervallo e il raggio.