Рисование фигур.

jenya7

С простыми фигурами все вроде ясно.Но мне надо нарисовать что то более заковыристое - ромб, звездочку, стрелку. И тут я реально застопорился.Вот например треугольник
public void DrawItem(Radar radar, Graphics g)
 {
 PointF cp = radar.AzEl2XY(_azimuth, _elevation);
 PointF _topLeft = new PointF(cp.X - ((float)_width / 2), cp.Y - ((float)_height / 2));

 PointF p1 = new PointF((_topLeft.X + (_width / 2F)), _topLeft.Y);
 PointF p2 = new PointF(_topLeft.X, _topLeft.Y + _height);
 PointF p3 = new PointF(_topLeft.X + _width, _topLeft.Y + _height);

 _gp = new GraphicsPath(FillMode.Winding);
 _gp.AddPolygon(new PointF[] { p1, p2, p3 });

 g.FillPath(new SolidBrush(_color), _gp);
 }
А куда мне добавить четвертую точку чтоб получился ромб?
18 ответов

jenya7

jenya7,Дай код ромба и скрин что вышло.


jenya7

jenya7,Дай код ромба и скрин что вышло.
Код такой
public void DrawItem(Radar radar, Graphics g)
 {
 PointF cp = radar.AzEl2XY(_azimuth, _elevation);
 PointF _topLeft = new PointF(cp.X - ((float)_width / 2), cp.Y - ((float)_height / 2));

 PointF p1 = new PointF((_topLeft.X + (_width / 2F)), _topLeft.Y);
 PointF p2 = new PointF(_topLeft.X, _topLeft.Y + _height);
 PointF p3 = new PointF(_topLeft.X + _width, _topLeft.Y + _height);
 PointF p4 = new PointF(_topLeft.X + _width, _topLeft.Y + (2*_height));

 _gp = new GraphicsPath(FillMode.Winding);
 _gp.AddPolygon(new PointF[] { p1, p2, p3, p4 });

 g.FillPath(new SolidBrush(_color), _gp);
 }


jenya7

jenya7,Теперь номера точек проставь. Рисовать надо по часовой или против.


jenya7

jenya7,Или 2 тр. Спиной друг к другу))


jenya7

jenya7,Теперь номера точек проставь. Рисовать надо по часовой или против.
а ктож знает номера точек. мне не хватает несколько форм. я выбрал таквертолет - треугольник вершиной вверхкорабль - прямоугольникнеизвестный объект - квадратподлодка - элипсосталось самолет, снаряд и наземный объект. вот думал нарисовать ромб, многоугольник и еще что нибудь.


jenya7

jenya7,Номера у тебя p1 - p4


jenya7

Я не понимаю - точка 0,0 - она слева сверху? если я откладываю по оси Х - нужно идти вправо, а по оси У - вниз?


jenya7

jenya7,Угу. Негодяи))))


jenya7

Наконец то я передал четыре вершины ромба правильно. Но он не закрасился.


jenya7

Наконец то я передал четыре вершины ромба правильно. Но он не закрасился.
Уже сказали же, что нужно рисовать по часовой или против часовой, а не в разноброд.Грубо говоря:p1 - верхняя вершинаp2 - правая вершинаp3 - нижняя вершинаp4 - левая вершина


jenya7

Уже сказали же, что нужно рисовать по часовой или против часовой, а не в разноброд.Грубо говоря:p1 - верхняя вершинаp2 - правая вершинаp3 - нижняя вершинаp4 - левая вершина
ура. спасибо. :)


jenya7

Мне нужно каждую фигуру обвести кружочком. Не могу придумать алгоритм как это сделать. Где выбрать центр кружка и какой диаметр.


jenya7

Мне нужно каждую фигуру обвести кружочком. Не могу придумать алгоритм как это сделать. Где выбрать центр кружка и какой диаметр.
Возьми тетрадь в клетку. Нарисуй точки. Там просто.


jenya7

Мне нужно каждую фигуру обвести кружочком. Не могу придумать алгоритм как это сделать. Где выбрать центр кружка и какой диаметр.
Если нужна окружность именно минимального радиуса включающая в себя произвольный многоугольник, то это не совсемтривиальная задача. Подробности освещены например здесь.https://en.wikipedia.org/wiki/Smallest-circle_problemА вот простой алгоритм, он просто строит окружность описывающую прямоугольник описывающий данный многоугольник.
private EllipseGeometry GetCircle(List<Point> _points)
		{
			var _maxX = _points.Select(x => x.X).Max();
			var _maxY = _points.Select(x => x.Y).Max();
			var _minX = _points.Select(x => x.X).Min();
			var _minY = _points.Select(x => x.Y).Min();

			var _size = Math.Sqrt((_maxX - _minX) * (_maxX - _minX) + (_maxY - _minY) * (_maxY - _minY));
			var _center = new Point((_minX + _maxX) / 2, (_minY + _maxY) / 2);

			var _circle = new EllipseGeometry(_center, _size / 2, _size / 2);

			return _circle;
		}
Получается вот такой результат


jenya7

Где выбрать центр кружка
Это центр тяжести


jenya7

спасибо. буду пробовать.


jenya7

jenya7,Или 2 тр. Спиной друг к другу))
у каждого треугольника три спины


jenya7

у каждого треугольника три спины
))) и главное, все 6 друг к другу.Бывает.