Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Цилиндр


Автор: Artemon 11.10.2006, 19:32
Рисую цилиндр:
Код

int X = 0, Y = 0, Width = 100, Height = 50;
            GraphicsPath gp = new GraphicsPath();
            gp.AddEllipse(X,Y,Width, Height);
            gp.AddArc(X, Y, Width, Height, 0, 180);
            gp.AddLine(X, Y + Height / 2, X, (Y + Height / 2)+100);
            gp.AddArc(X, Y+100, Width, Height, 0, 180);
            gp.AddLine(X+Width, Y + Height / 2, X+Width, (Y + Height / 2) + 100);


А получаю какуюто не суразицу, что-то не могу понять в чем дело.

Автор: Дрон 11.10.2006, 19:41
Artemon, я не силён в GDI+ и проверять некогда, но есть предположение, что он соединяет первую точку каждого следующий элемента (линии, дуги и т.п.) с последней точкой предыдущего.

Если я не прав, то извиняйте smile

Автор: mr.DUDA 11.10.2006, 21:22
Artemon, полный код функции рисующей цилиндр - в студию, пожалуйста smile

Автор: Artemon 13.10.2006, 13:22
Код в студии:


Код

private void Form1_Paint(object sender, PaintEventArgs e)
        {

            int X = 0, Y = 0, Width = 100, Height = 50;
            Graphics g = e.Graphics;
            GraphicsPath gp = new GraphicsPath();
            Brush br = new SolidBrush(Color.Red);
            Pen Pn = new Pen(br);

            gp.AddEllipse(X, Y, Width, Height);
            gp.AddArc(X, Y, Width, Height, 0, 180);
            gp.AddLine(X, Y + Height / 2, X, (Y + Height / 2) + 100);
            gp.AddArc(X, Y + 100, Width, Height, 0, 180);
            gp.AddLine(X + Width, Y + Height / 2, X + Width, (Y + Height / 2) + 100);

            g.DrawPath(Pn,gp);
        }

Автор: mr.DUDA 13.10.2006, 14:01
Вот так нормально:
Код
            gp.AddEllipse(X, Y, Width, Height);
            gp.AddLine(X + Width, (Y + Height / 2) + 100, X + Width, Y + Height / 2);
            gp.AddArc(X, Y + 100, Width, Height, 0, 180);
            gp.AddLine(X, Y + Height / 2, X, (Y + Height / 2) + 100);


Автор: Artemon 13.10.2006, 19:06
Я уже было обрадовался что все работает, но не тут-то было:

Если попытаться залить фигуру, то получим заливку непонятно каких частей 

Код

g.FillPath(br, gp);

Автор: mr.DUDA 14.10.2006, 16:24
Artemon, про заливку сразу надо было сказать smile.

Путь должен быть замкнутый, и порядок обхода - в одну сторону (по часовой стрелке):
Код
            gp.AddEllipse(X, Y, Width, Height);
            gp.AddArc(X, Y, Width, Height, 180, -180);
            gp.AddLine(X + Width, (Y + Height / 2) + 100, X + Width, Y + Height / 2);
            gp.AddArc(X, Y + 100, Width, Height, 0, 180);
            gp.AddLine(X, Y + Height / 2, X, (Y + Height / 2) + 100);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)