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)
Kod: Zaznacz cały
kat = (y2 - y) / (x2 - x)
[ 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);
}