2010-05-25 14 views
6

Jak mogę zasymulować malowanie okien w sprayu? Myślę, że to tworzy losowe punkty, jaka jest twoja opinia?Symulowanie aerozolu

+0

Czy chodzi o tworzenie sprayu przy użyciu C#? Jeśli nie, dlaczego jest to oznaczane jako "C#"? –

+0

Tak, to jest o tworzeniu sprayu w C# –

+0

Działa dla mnie, a następnie. Czasem zdarza się, że pytanie ma tag, ale pytanie brzmi bardzo ogólne i nie wspomina o żadnym związku z tagiem. Dzięki, Hesam. –

Odpowiedz

5

Tak, powiedziałbym, że kolory losowych pikseli w określonym promieniu punktu wyboru. Prawdopodobnie istnieje również opóźnienie czasowe między kolorowaniem jednego piksela a drugim, ponieważ dzisiejsze maszyny są wystarczająco szybkie, aby móc zabarwić każdy możliwy piksel (o ile promień jest mały), zanim można było zwolnić przycisk myszy.

Ponadto, myślę, że algorytm, który używa Paint, może wybrać piksel do pomalowania, nawet jeśli został już pomalowany, ponieważ czasami można skończyć z pomalowanym kółkiem z kilkoma niepomalowanymi pikselami w środku.

+0

'Prawdopodobnie istnieje również opóźnienie czasowe między kolorowaniem jednego piksela a drugim" - maluje się tylko wtedy, gdy mysz porusza się między jedną ramą a drugą. –

+1

@ BlueRaja, Właśnie otworzyłem mspaint i przytrzymałem przycisk myszy. Okrąg powoli wypełnił się bez poruszania myszą. FYI. –

+0

Należy również pamiętać, że jest rozpylany z czynnikiem przezroczystości. Jeśli piksel zostanie spryskany innym pikselem, przezroczystość stanie się bardziej nieprzezroczysta. Cóż, Paint nie robi tego, ale robi to Photoshop – Icemanind

-1

Myślę, że trudno jest znaleźć próbkę na C#. Poniżej przedstawiam sposób na rozpoczęcie tej podróży. Tutaj używam pędzla tekstury.

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!"); 
    } 

} 

jak powiedział Jesse, myślę, że powinieneś znaleźć algorytm rozprzestrzeniania losowych pikseli.

3

Wzór farby w sprayu będzie półsamosny. Jeśli wyjmiesz puszkę Krylona i powoli spryskasz linię na ścianie, skończysz z szeroką linią ciągłą, która znika na tle z gradientem wokół krawędzi. Rozpylaj w jednym miejscu przez dziesięć sekund, a na środku pojawi się duża kropka, w której kolor jest w pełni nasycony, z promieniowym gradientem w tle.

So- zmiennych dla symulacji obejmują:

  • Czas trzymania "opryskiwacz" (przycisk myszy)
  • ruch "can" (mysz)
  • prędkość "może" (szybkie ruchy tworzą lekką, nienasyconą linię Powolne ruchy tworzą gęstą, nasyconą linię z gradientem)
  • rozprzestrzenić wzór: czy aerozol jest skoncentrowany jak aerograf lub duży jak aerozol?
  • "Odległość": Jak daleko znajduje się "rozpylacz" od "płótna"?
2

Otrzymano wiele odpowiedzi wskazujących właściwy kierunek, aby rozpocząć obsługę doświadczenia użytkownika w zakresie działania sprayu. Na podstawie Twojej odpowiedzi na mój komentarz potrzebujesz również algorytmu do generowania losowych punktów w promieniu.

Istnieje wiele sposobów, aby to zrobić, i prawdopodobnie najbardziej oczywistym byłoby użycie polar coordinates, aby wybrać losowy punkt, a następnie przekształcić współrzędną biegunową na współrzędną kartezjańską (x, y), aby renderować piksel. Oto prosty przykład tego podejścia. Aby wszystko było proste, właśnie narysowałem prostą elipsę 1x1 dla każdego punktu.

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)); 
    } 
    } 
} 

Alternatywnie, można losowo wybrać współrzędne x, y z prostokąta, który pasuje do koła rozpylacza i za pomocą koła równanie R^2 = x^2 + y^2 Test punkt celu określenia, czy leży wewnątrz krąg, jeśli przypadkowo wybierzesz inny punkt i przetestujesz ponownie, dopóki nie znajdziesz punktu, który znajduje się w okręgu. Oto szybki próbka tego podejścia

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

Można utworzyć obraz natrysku różnych natężeń przez próbkowanie pewną liczbę (w odniesieniu do pożądanej intensywności i spread) współrzędnych biegunowych.W tym celu określenia losowego coordiate polarny (ρ, θ) dla każdej próbki przez:

ρ pochodzących od N (0, 1) Używając Normal (Gaussian) distribution odległości z dokładnie w środku swojej rozpylenia. Nie pamiętam, czy istnieje normalny generator zmiennoprzecinkowy w bibliotece .NET. Jeśli nie, możesz create one from a U(0, 1) generator.

θ próbki z U (0, π) próbki kątowa składnika z Uniform Continuous Distribution. Bez utraty wydajności lub ogólności, można zamiast spróbować na U ( n π, m π) dla n < m, ale U (0, π) prawdopodobnie będzie w porządku za to, co trzeba.

kartezjańskich współrzędnych każdej próby są podane w (T x + S x ρ cos θ T Y + S Y ρ sin θ), w którym (T x T y) jest środkiem wzoru natryskiwania, który chcesz utworzyć; S x i S y są współczynnikami rozprzestrzeniania się, które chcesz mieć odpowiednio w kierunkach x i y.

0

Spróbuj użyć timera

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; 
    }  
} 

należy zmodyfikować odstęp czasu i promień.

Powiązane problemy