Siec petriego - prosta geometria - pytania

Wielokąty (n>3). Okręgi. Inne figury płaskie. Zadania i twierdzenia z nimi związane. Geometria rzutowa na płaszczyżnie.
one_eddie
Użytkownik
Użytkownik
Posty: 3
Rejestracja: 20 mar 2006, o 16:38
Płeć: Mężczyzna
Lokalizacja: Polska

Siec petriego - prosta geometria - pytania

Post autor: one_eddie »

Postanowilem napisac prosty program - edytor i symulator sieci Petriego.
Chcialem dosc ogolnie napisac algorytm rysujacy elementy sieci, ale trafilem na maly problem.

Przykladowa siec wyglada tak.

// przepraszam za zakodowanego linko ale nie moge podobno ich oddawac
h_t_t_p_:_/_/w_w_w.imagic.pl/public/pview/69182/Image2.jpg

Chcialem poprowadzic prosta od jednego elementu to 2, ale ponieaz posiadam srodki tych elementow, a jeden z koncow posiada grot, pojawil sie problem. Strzalka musi konczyc sie wczesniej niz element, dlatego szybko wpadlem na pomysl zeby element otoczyc okregiem, poszukac punktu przeciecia sie prostej z okregiem i ten wlasnie punkt przyjac do rysowania lini.

No wiec punkt licze tak:

Kod: Zaznacz cały

x = x0 + r * cos(kat)
y = y0 + r * sin(kat)
sam kat oblicam uzywajac

Kod: Zaznacz cały

kat = (y2 - y) / (x2 - x)
Patrzac na rysunek (np p4) widac ze puntk wyznaczony zostal dokladnie po 2 stronie. Wiem ze kat jest zle wyznaczany. Niestety moja uboga wiedza nie pozwala mi znalezc popelionego przeze mnie bledu. Prosze o pomoc lub wskazowke.

[ Dodano: 10 Września 2007, 13:06 ]
Mysle ze kod ktory napisalem moze troche rozjasnic sprawe.

Oto on:

Kod: Zaznacz cały

private void Form1_Load(object sender, EventArgs e)
{
	Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
	pictureBox1.Image = bmp;

	Graphics g = Graphics.FromImage(pictureBox1.Image);
	g.FillRectangle(new SolidBrush(Color.White), pictureBox1.ClientRectangle);

	int shift = 150;
	int csize = 50;
	Point c = new Point(pictureBox1.ClientRectangle.Width / 2, pictureBox1.ClientRectangle.Height / 2);

	int c1x = c.X - shift,
		c1y = c.Y,
		
		c2x = c.X,
		c2y = c.Y - shift,
		
		c3x = c.X + shift,
		c3y = c.Y,
		
		c4x = c.X,
		c4y = c.Y + shift;

	g.DrawEllipse(new Pen(Color.Red), c1x - csize / 2, c1y - csize / 2, csize, csize);
	g.DrawEllipse(new Pen(Color.Red), c2x - csize / 2, c2y - csize / 2, csize, csize);
	g.DrawEllipse(new Pen(Color.Red), c3x - csize / 2, c3y - csize / 2, csize, csize);
	g.DrawEllipse(new Pen(Color.Red), c4x - csize / 2, c4y - csize / 2, csize, csize);

	g.DrawLine(new Pen(Color.Red), c1x, c1y, c2x, c2y);
	g.DrawLine(new Pen(Color.Red), c2x, c2y, c3x, c3y);
	g.DrawLine(new Pen(Color.Red), c3x, c3y, c4x, c4y);
	g.DrawLine(new Pen(Color.Red), c4x, c4y, c1x, c1y);

	double c1_a = Math.Atan((c2y - c1y) / (c2x - c1x) );
	int p1x = (int)(c1x + csize/2 * Math.Cos(c1_a)),
		p1y = (int)(c1y + csize/2 * Math.Sin(c1_a));

	g.FillRectangle(new SolidBrush(Color.Black), p1x - 1, p1y - 1, 3, 3);

	double c2_a = Math.Atan((c3y - c2y) / (c3x - c2x));
	int p2x = (int)(c2x + csize / 2 * Math.Cos(c2_a)),
		p2y = (int)(c2y + csize / 2 * Math.Sin(c2_a));

	g.FillRectangle(new SolidBrush(Color.Black), p2x - 1, p2y - 1, 3, 3);

	// bledny kat
	double c3_a = Math.Atan((c3y - c4y) / (c3x - c4x));
	int p3x = (int)(c3x + csize / 2 * Math.Cos(c3_a)),
		p3y = (int)(c3y + csize / 2 * Math.Sin(c3_a));

	g.FillRectangle(new SolidBrush(Color.Black), p3x - 1, p3y - 1, 3, 3);

	// bledny kat
	double c4_a = Math.Atan((c1y - c4y) / (c1x - c4x));
	int p4x = (int)(c4x + csize / 2 * Math.Cos(c4_a)),
		p4y = (int)(c4y + csize / 2 * Math.Sin(c4_a));

	g.FillRectangle(new SolidBrush(Color.Black), p4x - 1, p4y - 1, 3, 3);

}
ODPOWIEDZ