Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
 Аватар для kernel_mode
70 / 47 / 16
Регистрация: 21.07.2021
Сообщений: 187

Проверка принадлежности точки многоугольнику

16.05.2022, 21:43. Показов 862. Ответов 2
Метки c# (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую, попробовал реализовать метод "Индекс точки относительно многоугольника" для определения принадлежности точки многоугольнику.

Написал тесты, могли бы проверить на сколько метод корректен?
Использовал разные типы Vector и Vector2, ибо набор функций у всех разный, а нужны были и те и другие.


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
        public class Area2D
        {
            private List<Tuple<Vector, Vector>> edges = new List<Tuple<Vector, Vector>>();
            public Area2D(List<Vector2> _map)
            {
                if (_map.Count < 3)
                    throw new Exception("invalid figure");
 
                for (int i = 0; i < _map.Count - 1; i++)
                {
                    edges.Add(new Tuple<Vector, Vector>(
                        new Vector() { X = _map[i].X, Y = _map[i].Y },
                        new Vector() { X = _map[i + 1].X, Y = _map[i + 1].Y }));
                }
                edges.Add(new Tuple<Vector, Vector>(
                        new Vector() { X = _map.Last().X, Y = _map.Last().Y },
                        new Vector() { X = _map.First().X, Y = _map.First().Y }));
 
            }
 
            public bool IsInside(Vector2 _coord)
            {
                var coord = new Vector(_coord.X, _coord.Y);
                double AnglSum = 0;
                foreach (var eng in edges)
                {
                    var VectrA = eng.Item1 - coord;
                    var VectrB = eng.Item2 - coord;
 
                    Vector2 v2A = new Vector2() { X = (float)VectrA.X, Y = (float)VectrA.Y };
                    Vector2 v2B = new Vector2() { X = (float)VectrB.X, Y = (float)VectrB.Y };
 
                    Vector2 cntr = new Vector2(0, 0);
                    var A = Vector2.Distance(cntr, v2A);
                    var B = Vector2.Distance(cntr, v2B);
                    var C = Vector2.Distance(v2A, v2B);
 
                    var crntangl = Math.Acos((A * A + B * B - C * C) / (A * B * 2));
                    var crosPrd = Vector.CrossProduct(VectrA, VectrB);
                    if (crosPrd > 0)
                        AnglSum += crntangl;
 
                    if (crosPrd < 0)
                        AnglSum -= crntangl;
                }
                AnglSum = AnglSum / 2.0;
                double rndnd = Math.Round(AnglSum);
                if (Math.Abs(rndnd) == 0)
                    return false;
 
                return true;
            }
        }
Тесты:



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
            var Map = new List<Vector2> {
                new Vector2(0f, 0f),
                new Vector2(4f, 0f),
                new Vector2(4f, 4f),
                new Vector2(1f, 4f),
                new Vector2(1f, 3f),
                new Vector2(3f, 3f),
                new Vector2(3f, 1f),
                new Vector2(0.5f, 1f),
                new Vector2(0.5f, 4f),
                new Vector2(0.0f, 4f)};
 
 
            var Area = new Area2D(Map);
            var test1 = Area.IsInside(new Vector2(-1.0f, -1.0f));
            var test2 = Area.IsInside(new Vector2(4.5f, 1.0f));
            var test3 = Area.IsInside(new Vector2(2.0f, 2.0f));
            var test4 = Area.IsInside(new Vector2(0.75f, 3.75f));
 
            var test5 = Area.IsInside(new Vector2(1.0f, 1.0f));
            var test6 = Area.IsInside(new Vector2(3.25f, 3.25f));
 
            Console.WriteLine($"Result test1: {test1}");
            Console.WriteLine($"Result test2: {test2}");
            Console.WriteLine($"Result test3: {test3}");
            Console.WriteLine($"Result test3: {test4}");
            Console.WriteLine($"Result test3: {test5}");
            Console.WriteLine($"Result test3: {test6}");
Название: test.png
Просмотров: 83

Размер: 2.5 Кб
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.05.2022, 21:43
Ответы с готовыми решениями:

Проверка принадлежности точки (х, у) отрезку АВ
Добрый день! // проверка принадлежности точки (х, у) отрезку АВ - проверка коллинеарности векторов и // расположения точки по оси...

Определение принадлежности точки треугольнику
Написать программу определения принадлежности точки треугольника

Определение принадлежности точки к области
Пожалуйста, помогите написать программу на C# по определению точки области

2
 Аватар для kernel_mode
70 / 47 / 16
Регистрация: 21.07.2021
Сообщений: 187
19.05.2022, 16:57  [ТС]


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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Numerics;
 
 
namespace WowBotV2
{
    public partial class TestForm : Form
    {
        PointF[] pList;
        List<Vector2> Map;
        Graphics g;
        public TestForm()
        {
            InitializeComponent();
            var map = new List<Vector2> {
                new Vector2(0f, 0f),
                new Vector2(4f, 0f),
                new Vector2(4f, 4f),
                new Vector2(1f, 4f),
                new Vector2(1f, 3f),
                new Vector2(3f, 3f),
                new Vector2(3f, 1f),
                new Vector2(0.5f, 1f),
                new Vector2(0.5f, 4f),
                new Vector2(0.0f, 4f)};
            Map = map;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            var xMin = Map.Min(x => x.X);
            var xMax = Map.Max(x => x.X);
            var yMin = Map.Min(x => x.X);
            var yMax = Map.Max(x => x.X);
 
            var xOffset = (float)(this.Size.Width * 0.20);
            var yOffset = (float)(this.Size.Height * 0.20);
            var xScale = (float)(this.Size.Width * 0.55);
            var yScale = (float)(this.Size.Height * 0.55);
 
 
            pList = new PointF[Map.Count];
            for (int i = 0; i < Map.Count; i++)
            {
                pList[i] = new PointF((Map[i].X / xMax * xScale) + xOffset,
                                      (Map[i].Y / yMax * yScale) + yOffset);
            }
 
            var p = Pens.Black;
 
 
 
            g = CreateGraphics();
            g.Clear(Color.Silver);
            g.DrawPolygon(p, pList);
 
 
            Area2D area = new Area2D(Map);
            Brush bTrue = (Brush)Brushes.Green;
            Brush bFalse = (Brush)Brushes.Red;
 
            for (int x = -3; x < xMax + 3; x++)
            {
                for (int y = -3; y < yMax + 3; y++)
                {
                    if (area.IsInside(new Vector2(x, y)))
                        g.FillRectangle(bTrue,
                            x / xMax * xScale + xOffset,
                            y / yMax * yScale + yOffset,
                            5, 5);
                    else
                        g.FillRectangle(bFalse,
                            x / xMax * xScale + xOffset,
                            y / yMax * yScale + yOffset,
                            5, 5);
                }
            }
        }
    }
}
0
 Аватар для kernel_mode
70 / 47 / 16
Регистрация: 21.07.2021
Сообщений: 187
19.05.2022, 18:12  [ТС]
Повысил интенсивность точек и попробовал более сложную фигуру. Использовать Vector2 с float'ами было ошибкой.
Вот разница
С float:



С double:

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.05.2022, 18:12
Помогаю со студенческими работами здесь

Программа определения принадлежности точки треугольнику
Написать программу определения принадлежности точки треугольнику Не получается написать программу помогите пожалуйста.

Определение принадлежности точки заданной области
1)Для данной области составьте линейную программу, которая печатает true, если точка с координатами (х, у) принадлежит закрашенной области,...

Определение принадлежности точки клика к части изображения
Здравствуйте. Пишу простую программу для подсчета очков в игре дартс. На форме лежит картинка с изображением игровой мишени. Одна идея...

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

Определить принадлежности точки к заштрихованной области на координатной плоскости
Помогите написать программу, для определения принадлежности точки


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru