Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
1 / 1 / 0
Регистрация: 09.05.2017
Сообщений: 26
1

Как сделать конец линии жирным

12.07.2017, 16:10. Показов 1280. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Необходимо соединить линиями окружности, которые строятся по определённым координатам. С помощью линии необходимое соединить одну окружность с другой. Сделать это планировал с помощью цикла. Соединять определенные вершины по их координатам, которые хранятся в соответствующих списках для Х и для Y. Однако линии должны иметь направление. Если делать их стрелками(LineCap.ArrowAnchor),то наконечники утопают в соединяемых окружностях, а делать координаты конца и начала для каждой линии как бы не желательно. Поэтому решил сделать просто, последняя треть линии становиться жирнее, что будет указывать на её направление. Но тут опять столкнулся с проблемой, можно как бы нарисовать в конце линии, линию пожирнее но тут опять проблема с координатами.
Подскажите можно как нибудь сделать так,чтобы конец линии становился жирнее, как в образце?
Миниатюры
Как сделать конец линии жирным  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.07.2017, 16:10
Ответы с готовыми решениями:

Как сделать так, чтобы линии не перекрывали фигуры?
Делаю редактор графа, и столкнулся с одной проблемой - при рисовании ребер графа линии перекрывают...

Как в среде vs2008 сделать линии на форме и знать координаты курсора?
Здравствуйте) Как в среде vs2008 сделать линии на форме и знать координаты курсора? (лучше конечно...

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

Как сделать жирным заголовок в WordPress?
Привет всем! У меня проблема. В общем в админке есть раздел записей, где можно добавлять,...

4
8940 / 4852 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
12.07.2017, 19:07 2
Лучший ответ Сообщение было отмечено SkyDen как решение

Решение

Тебе нужно решить две задачи:
  1. Найти координаты пересечения отрезка, соединяющего центры окружностей, с этими окружностями
  2. Построить линию со стрелкой между этими координатами.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/// <summary>
/// Координаты отрезка между окружностями на прямой, проходящей через центры окружностей
/// </summary>
/// <param name="center1">Центр первой окружности</param>
/// <param name="r1">Радиус первой окружности</param>
/// <param name="center2">Центр второй окружности</param>
/// <param name="r2">Радиус второй окружности</param>
private static Tuple<PointF, PointF> LineBetweenCircles(PointF center1, float r1, PointF center2, float r2)
{
    var v = new Vector(center2.X - center1.X, center2.Y - center1.Y);
    v.Normalize();
    var start = Vector.Add(new Vector(center1.X, center1.Y), v*r1);
    var end = Vector.Add(new Vector(center2.X, center2.Y), -v*r2);
    return new Tuple<PointF, PointF>(new PointF((float)start.X, (float)start.Y), new PointF((float)end.X, (float)end.Y));
}
 
/// <summary>
/// Отрезок со стрелкой на конце
/// </summary>
/// <param name="start">Начальная точка</param>
/// <param name="end">Конечная точка</param>
/// <param name="l">Длина стрелки</param>
/// <param name="w">Раствор стрелки</param>
private static GraphicsPath LineWithArrow(PointF start, PointF end, float l, float w)
{
    var result = new GraphicsPath();
    var v = new Vector(end.X - start.X, end.Y - start.Y);
    var n = v;
    n.Normalize();
    v = Vector.Subtract(new Vector(end.X, end.Y), n * l);
    var n1 = new PointF((float)(-n.Y * w / 2 + v.X), (float)(n.X * w / 2 + v.Y));
    var n2 = new PointF((float)(n.Y * w / 2 + v.X), (float)(-n.X * w / 2 + v.Y));
    result.AddLine(start, end);
    result.StartFigure();
    result.AddLine(n1, end);
    result.AddLine(n2, end);
    return result;
}
Использование (g — Graphics):
C#
1
2
3
4
5
6
7
8
var pt1 = new PointF(100, 100);
var pt2 = new PointF(300, 300);
var r1 = 10f;
var r2 = 15f;
g.DrawEllipse(Pens.Red, pt1.X - r1, pt1.Y - r1, 2 * r1, 2 * r1);
g.DrawEllipse(Pens.Red, pt2.X - r2, pt2.Y - r2, 2 * r2, 2 * r2);
var points = LineBetweenCircles(pt1, r1, pt2, r2);
g.DrawPath(Pens.Blue, LineWithArrow(points.Item1, points.Item2, 25, 10));
К проекту подключить библиотеку WindowsBase.dll и из неё импортировать пространство имён System.Windows
Миниатюры
Как сделать конец линии жирным  
1
309 / 317 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
13.07.2017, 12:48 3
У Pen есть свойства EndCap и StartCap. Там можно подобное задать, но правда гибкости минимум
0
1 / 1 / 0
Регистрация: 09.05.2017
Сообщений: 26
13.07.2017, 16:46  [ТС] 4
Спасибо) Постараюсь разобраться.
0
8940 / 4852 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
13.07.2017, 18:12 5
SkyDen, можно сделать как говорит sldp, только использовать свойство CustomEndCap. Вычисление точек на окружности такое же, а рисовать так:
C#
1
2
3
4
5
6
7
8
9
10
using (var pen = new Pen(Color.Blue) {CustomEndCap = new AdjustableArrowCap(5, 20, true)}) {
    var pt1 = new PointF(100, 100);
    var pt2 = new PointF(300, 300);
    var r1 = 10f;
    var r2 = 15f;
    g.DrawEllipse(Pens.Red, pt1.X - r1, pt1.Y - r1, 2 * r1, 2 * r1);
    g.DrawEllipse(Pens.Red, pt2.X - r2, pt2.Y - r2, 2 * r2, 2 * r2);
    var points = LineBetweenCircles(pt1, r1, pt2, r2);
    g.DrawLine(pen, points.Item1, points.Item2);
}
1
13.07.2017, 18:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2017, 18:12
Помогаю со студенческими работами здесь

Как сделать отдельный кусок текста жирным?
То есть, как сделать чтобы было вот так например. Hello Happy World. И ещё как изменить цвет...

Как при нажатии на кнопку сделать стиль теста сразу в нескольких блоках жирным
так ли я делаю . Только начинаю извините за корявый код. :cry: javascript function...

Как сделать шрифт текста "жирным"?
Здравствуйте. имеется код для перевода текста в жирный &quot;режим )&quot;. как его изменить так чтобы он не...

HTML!? Input Type = "text", как сделать чтобы у этого элемента не было границ, и шрифт был жирным???
&lt;INPUT type=&quot;text&quot; id=&quot;ztext&quot; style=&quot;border:none&quot; value=&quot;Солдат&quot;&gt; вот так без границ делаю,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru