Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 04.12.2016
Сообщений: 13

Мишень

08.04.2017, 18:34. Показов 1844. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как построить такую вот мишень?
Помогите , пожалуйста
Миниатюры
Мишень  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.04.2017, 18:34
Ответы с готовыми решениями:

Построить графическую мишень в форме
как построить такую вот мишень? Какие методы Graphics использовать? помогите,пожалуйста , с реализацией

Как построить такую мишень?
Помогите пожалуйста

Мишень
Получил задание "Мишень" оно представляет из себя консольное приложение и в основе лежит условие если точка попадает в выделенную область...

2
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
09.04.2017, 01:17
Лучший ответ Сообщение было отмечено ilya312 как решение

Решение

Класс Aim.cs
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
class Aim
{
    //Параметры графика
 
    public float R { get; private set; }
    public float A { get; private set; }
 
    public float B { get; private set; }
 
    //Правая закрашенная область
    private readonly GraphicsPath _rightRegion;
    //Левая закрашенная область
    private readonly GraphicsPath _leftRegion;
    //Вершины прямоугольника, ограничивающего окружность
    private readonly PointF[] _circle;
    //Вершины прямоугольника
    private readonly PointF[] _rect;
 
    public Aim(float r, float a, float b)
    {
        B = b;
        A = a;
        R = r;
        _circle = new[]
                    {
                    new PointF(-R,-R),
                    new PointF(R,-R),
                    new PointF(R,R),
                    new PointF(-R,R),
                };
        _rect = new[]
                {
                new PointF(-A,-B),
                new PointF(A,-B),
                new PointF(A,B),
                new PointF(-A,B),
            };
        _rightRegion = GetRightRegion();
        _leftRegion = GetLeftRegion();
    }
 
    public GraphicsPath RightRegion
    {
        get
        {
            return _rightRegion;
        }
    }
 
    public GraphicsPath LeftRegion
    {
        get
        {
            return _leftRegion;
        }
    }
 
    public PointF[] Circle
    {
        get
        {
            return _circle;
        }
    }
 
    public PointF[] Rect
    {
        get
        {
            return _rect;
        }
    }
 
    private GraphicsPath GetRightRegion()
    {
        var gp = new GraphicsPath();
        var angle = (float)(Math.Asin(B / R) * 180 / Math.PI);
        gp.AddArc(RectangleF.FromLTRB(_circle[0].X, _circle[0].Y, _circle[1].X, _circle[2].Y), -angle, angle);
        gp.AddLine(R, 0, A, 0);
        gp.AddLine(A, 0, A, -B);
        gp.CloseAllFigures();
        return gp;
    }
 
    private GraphicsPath GetLeftRegion()
    {
        var gp = new GraphicsPath();
        var angle = (float)(Math.Asin(B / R) * 180 / Math.PI);
        gp.AddArc(RectangleF.FromLTRB(_circle[0].X, _circle[0].Y, _circle[1].X, _circle[2].Y), 180 - angle, angle);
        gp.AddLine(-R, 0, 0, 0);
        gp.AddLine(0, 0, 0, B);
        gp.CloseAllFigures();
        return gp;
    }
}

Форма
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
        //Принудительное обновление параметров
        Nud_ValueChanged(null, new EventArgs());
        //Пересчёт при перерисовке
        panel1.Resize += (_, __) => Nud_ValueChanged(null, new EventArgs());
    }
 
    private Aim _aim;
    private float _scale = 1;
    private readonly float _sq2 = (float)Math.Sqrt(2);
 
    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        var w = panel1.ClientSize.Width / 2f;
        var h = panel1.ClientSize.Height / 2f;
        e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
        e.Graphics.TranslateTransform(w, h);
 
        //Масштабирование графика
        using (var m = new Matrix())
        {
            m.Scale(_scale, _scale);
            _aim.RightRegion.Transform(m);
            _aim.LeftRegion.Transform(m);
            m.TransformPoints(_aim.Rect);
            m.TransformPoints(_aim.Circle);
        }
        //Заливка областей
        e.Graphics.FillPath(Brushes.GreenYellow, _aim.RightRegion);
        e.Graphics.FillPath(Brushes.GreenYellow, _aim.LeftRegion);
        //Прямоугольник
        e.Graphics.DrawPolygon(Pens.Red, _aim.Rect);
        //Окружность
        e.Graphics.DrawEllipse(Pens.Blue, RectangleF.FromLTRB(_aim.Circle[0].X, _aim.Circle[0].Y, _aim.Circle[1].X, _aim.Circle[2].Y));
        //Ось X со стрелкой
        var arrow = GetArrow(0, 0, w, 0);
        e.Graphics.DrawLine(Pens.Black, -w, 0, w, 0);
        e.Graphics.DrawLines(Pens.Black, arrow);
        //Ось Y со стрелкой
        arrow = GetArrow(0, 0, 0, -h);
        e.Graphics.DrawLine(Pens.Black, 0, -h, 0, h);
        e.Graphics.DrawLines(Pens.Black, arrow);
        //Надписи
        DrawText("X", new PointF(w - 15, 5), e.Graphics);
        DrawText("Y", new PointF(-15, -h), e.Graphics);
        DrawText(string.Format("-{0}",_aim.A), new PointF(-_aim.A * _scale, -15), e.Graphics);
        DrawText(string.Format("{0}", _aim.A), new PointF(_aim.A * _scale, -15), e.Graphics);
        DrawText(string.Format("{0}", _aim.B), new PointF(-15, -_aim.B * _scale), e.Graphics);
        DrawText(string.Format("-{0}", _aim.B), new PointF(-15, _aim.B * _scale), e.Graphics);
        var pt = new PointF(-_aim.R * _scale / _sq2, -_aim.R * _scale / _sq2);
        e.Graphics.DrawLine(Pens.Black, 0, 0, pt.X, pt.Y);
        e.Graphics.DrawLines(Pens.Black, GetArrow(0, 0, pt.X, pt.Y));
        DrawText(string.Format("{0}", _aim.R), new PointF(pt.X - 15, pt.Y - 15), e.Graphics);
 
    }
 
    private void DrawText(string s, PointF point, Graphics g)
    {
        g.DrawString(s, Font, Brushes.Black, point);
    }
 
    private void Nud_ValueChanged(object sender, EventArgs e)
    {
        var maxValue = Math.Max(Math.Max(rNud.Value, aNud.Value), bNud.Value);
        var minSize = Math.Min(panel1.ClientSize.Width, panel1.ClientSize.Height) * 0.95m;
        _scale = (float)(minSize / maxValue) / 2;
        _aim = new Aim((float)rNud.Value, (float)aNud.Value, (float)bNud.Value);
        panel1.Invalidate();
    }
 
    private static PointF[] GetArrow(float x1, float y1, float x2, float y2, float len = 10, float width = 4)
    {
        PointF[] result = new PointF[3];
        //направляющий вектор отрезка
        var n = new PointF(x2 - x1, y2 - y1);
        //Длина отрезка
        var l = (float)Math.Sqrt(n.X * n.X + n.Y * n.Y);
        //Единичный вектор
        var v1 = new PointF(n.X / l, n.Y / l);
        //Длина стрелки
        n.X = x2 - v1.X * len;
        n.Y = y2 - v1.Y * len;
        result[0] = new PointF(n.X + v1.Y * width, n.Y - v1.X * width);
        result[1] = new PointF(x2, y2);
        result[2] = new PointF(n.X - v1.Y * width, n.Y + v1.X * width);
        return result;
    }
}
Миниатюры
Мишень  
Вложения
Тип файла: zip Aim.zip (17.8 Кб, 11 просмотров)
3
0 / 0 / 0
Регистрация: 04.12.2016
Сообщений: 13
09.04.2017, 20:16  [ТС]
Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.04.2017, 20:16
Помогаю со студенческими работами здесь

мишень
Построить программу, которая вводит координаты точки (x,y) и определяет, попадает ли точка в заштрихованную область на рисунке. Попадание...

Попадение в мишень
Для десяти выстрелов, координаты которых задаются с клавиатуры, вывести текстовые сообщения о попадании в мишень.Помогите...

Дана "мишень" в виде закрашенной области. Создать алгоритм для определения попадания точки с координатами (х,у) в мишень
Здравствуйте, форумчане. Помогите немного пожалуйста, а то программа ошибку выдает, а я что то не вкуриваю в чем проблема то... Дана...

Мишень С++
Здравствуйте, помогите пожалуйста, вылетело из головы как сделать мишень в С++.

Мишень
Друзья, привет. Нужно составить программу, решающую следующую задачу. В квадратном графическом окне высота и ширина, которого задаются...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru