c # библиотека чертежей вычисляет диапазоны и средние точки для рисования и окружности - PullRequest
0 голосов
/ 12 февраля 2019

В основном у меня есть меню, в котором пользователь выбирает фигуру, которую нужно нарисовать, затем пользователь нажимает на две точки, между этими двумя точками будет нарисована выбранная фигура.
Я сделал квадрат, который рассчитывается таким образом

// calculate ranges and mid points
xDiff = oppPt.X - keyPt.X;
yDiff = oppPt.Y - keyPt.Y;
xMid = (oppPt.X + keyPt.X) / 2;
yMid = (oppPt.Y + keyPt.Y) / 2;

// draw square
g.DrawLine(blackPen, (int)keyPt.X, (int)keyPt.Y,
    (int)(xMid + yDiff / 2), (int)(yMid - xDiff / 2));
g.DrawLine(blackPen, (int)(xMid + yDiff / 2), (int)(yMid - xDiff / 2),
    (int)oppPt.X, (int)oppPt.Y);
g.DrawLine(blackPen, (int)oppPt.X, (int)oppPt.Y,
    (int)(xMid - yDiff / 2), (int)(yMid + xDiff / 2));
g.DrawLine(blackPen, (int)(xMid - yDiff / 2),
    (int)(yMid + xDiff / 2), (int)keyPt.X, (int)keyPt.Y);

но я не могу понять, как нарисовать круг и треугольник одинаково

Пожалуйста, посоветуйте, спасибо

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

На том же пути.

int left = 20, top = 20
int right = 100, bot = 100;

// triangle
g.DrawLine(Pens.Red, left, bot, right, bot);
g.DrawLine(Pens.Red, right, bot, left + (right-left) / 2 /* was miss calc */, top);
g.DrawLine(Pens.Red, left + (right - left) / 2, top, left, bot);  // better looks
//g.DrawLine(Pens.Red, left, bot, left + (right-left) / 2 /* was miss calc */, top);

// circle
int len = (right - left) / 2;
int centerX = left + (right - left) / 2, centerY = top + (bot - top) / 2;
for (int i = 0; i <= 360; i++)
{
    int degrees = i;
    double radians = degrees * (Math.PI / 180);

    int x = centerX + (int)(len * Math.Cos(radians));
    int y = centerY + (int)(len * Math.Sin(radians));
    e.Graphics.FillRectangle(Brushes.Red, x, y, 1, 1); // single pixel drawing
}

Но с Эллипсом сложнее

http://www.petercollingridge.co.uk/tutorials/computational-geometry/finding-angle-around-ellipse/

Верхняя ссылка - это помощь по Эллипсу

0 голосов
/ 12 февраля 2019

Если вы укажете с двумя точками ((x1, y1), (x2, y2)) диаметр круга, то используйте DrawEllipse с x, y, w, h

x = cx-r

y = cy-r

d = w = h = sqrt ((x2-x1) ^ 2 + (y2-y1) ^ 2)

где

cx = | x2-x1 | / 2

cy = | y2-y1 | / 2

r = d / 2

Для треугольника выправда, нужно три очка.Вы можете ограничить его двумя точками, как при определении гипотенузы прямоугольного треугольника.Это все еще недостаточно информации, потому что есть два прямоугольных треугольника, которые могут иметь этот гипотенузу, верхняя и нижняя сторона.Какой треугольник ты хочешь?правильно, изо, острый, равносторонний, тупой?

0 голосов
/ 12 февраля 2019

Чтобы нарисовать круг, используйте g.DrawEllipse, вот хороший способ его расширения:

public static void DrawCircle(Graphics g, Pen pen, float centerX, float centerY, float radius)
{
    g.DrawEllipse(pen, centerX - radius, centerY - radius, radius + radius, radius + radius);
}

Чтобы нарисовать заполненный, просто измените DrawEllipse на FillElipse и Pen на Brush:

public static void DrawCircleFilled(Graphics g,  Brush brush, float centerX, float centerY, float radius)
{
    g.FillEllipse(brush, centerX - radius, centerY - radius, radius + radius, radius + radius);
}

Если вы настаиваете на рисовании фигур только линиями, то не бойтесь.Trinagle просто нарисован с тремя линиями, это довольно легко, поэтому я не буду писать это здесь.Что касается круга:

Круг состоит из нескольких сегментов, чем больше сегментов, тем лучше качество круга.Вы можете начать с простого треугольника, затем добавить еще одну линию, и у вас есть квадрат, затем пятиугольник, шестиугольник и так далее.С каждой линией формы оптически больше напоминают окружности.

Как видите, каждая линия покрывает (360 / N) общего угла.Таким образом, вы можете использовать цикл для рисования всех сегментов (линий).

...