Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/22: Рейтинг темы: голосов - 22, средняя оценка - 4.64
39 / 28 / 8
Регистрация: 14.04.2012
Сообщений: 249

Как определить пренадлежит ли точка отрезку?

20.11.2013, 12:17. Показов 5119. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нашёл уравнение (x-x1)/(x2-x1)=(y-y1)/(y2-y1)
значения переменных следующие:
x1=100: y1=105
x2=105: y2=105
x=100: y=100

подставляем значения
(100-100)/(105-100)=(100-105)/(105-105)
0/5= -5/0
0 = 0
значит точка лежит на отрезке, но на самом деле не лежит. Как такое возможно? Или уравнение не верно? Может есть другой вариант как определить лежит ли точка на отрезке
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.11.2013, 12:17
Ответы с готовыми решениями:

Определить, пренадлежит ли точка М
Нужна готовая программа в VBA Excel

Определить пренадлежит ли точка заштрихованной области
Задание: пренадлежит ли точка M(x,y) заданой области?

определить пренадлежит ли точка с координатами (x,y) кругу радиуса r
определить пренадлежит ли точка с координатами (x,y) кругу радиуса r. Центр круга расположен в начале координат

31
39 / 28 / 8
Регистрация: 14.04.2012
Сообщений: 249
22.11.2013, 22:08  [ТС]
Студворк — интернет-сервис помощи студентам
Юпатов Дмитрий,
График я нарисовал, чтобы понять, где возможно пересечение и ловил это значение в пошаговой отладке. Точность я увеличивал до 0.1 не помогло. В принципе надо попробовать всё грубо округлить, может поможет.
0
 Аватар для ViterAlex
8953 / 4865 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
22.11.2013, 23:04
Точка пересечения прямых ищется аналитически очень просто (Википедия)
Функция:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    ''' <summary>
    ''' Функция для нахождения точки пересечения двух прямых, проходящих через заданные точки
    ''' </summary>
    ''' <param name="p1">Первая точка первой прямой</param>
    ''' <param name="p2">Вторая точка первой прямой</param>
    ''' <param name="p3">Первая точка второй прямой</param>
    ''' <param name="p4">Вторая точка второй прямой</param>
    ''' <returns>Возвращает координату точки пересечения. Если прямые параллельны, то возвращается Nothing</returns>
    Private Function CrossPoint(p1 As Point, p2 As Point, p3 As Point, p4 As Point) As PointF
        Dim a1, a2, b1, b2, c1, c2 As Integer
        a1 = p1.Y - p2.Y : b1 = p2.X - p1.X : c1 = p1.X * p2.Y - p2.X * p1.Y
        a2 = p3.Y - p4.Y : b2 = p4.X - p3.X : c2 = p3.X * p4.Y - p4.X * p3.Y
        Dim pt As New PointF
        If a1 * b2 - a2 * b1 = 0 Then
            pt = Nothing 'Прямые параллельны
        Else
            pt.X = Convert.ToDecimal(b1 * c2 - b2 * c1) / Convert.ToDecimal(a1 * b2 - a2 * b1)
            pt.Y = Convert.ToDecimal(c1 * a2 - c2 * a1) / Convert.ToDecimal(a1 * b2 - a2 * b1)
        End If
        Return pt
    End Function
Использование (для координат из этого сообщения)
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
        Dim pt As PointF= CrossPoint(New Point(0, 110), New Point(202, 110), New Point(129, 170), New Point(200, 100))
        If pt.Equals(Nothing) Then
            MessageBox.Show("Прямые параллельны")
        Else
            MessageBox.Show(String.Format("Прямые пересекаются в точке {0}", pt.ToString()))
        End If
1
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
22.11.2013, 23:24
Цитата Сообщение от ViterAlex Посмотреть сообщение
Функция
Эм.. Point и PointF - это структуры. Так что неверно.
Скорми ей прямые пересекающиеся в точке (0, 0).

Цитата Сообщение от ViterAlex Посмотреть сообщение
Convert.ToDecimal
Не надо использовать Convert когда типы известны при компиляции.

Добавлено через 9 минут
Цитата Сообщение от Qwertiy Посмотреть сообщение
Скорми ей прямые пересекающиеся в точке (0, 0).
Не учёл, что Equals принимает Object, а не Point.
Наоборот, ошибка будет при параллельных прямых.
0
39 / 28 / 8
Регистрация: 14.04.2012
Сообщений: 249
22.11.2013, 23:26  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
Точка пересечения прямых ищется аналитически очень просто
Здорово! В принципе графически я правильно вычислил, если округлить.
Благодарю за помощь!
0
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
22.11.2013, 23:44
Цитата Сообщение от ViterAlex Посмотреть сообщение
Функция
Вот так будет работать:
VB.NET
1
2
3
4
5
6
Private Function CrossPoint(p1 As Point, p2 As Point, p3 As Point, p4 As Point) As PointF?
  Dim a1 As Integer = p1.Y - p2.Y, b1 As Integer = p2.X - p1.X, c1 As Integer = p1.X * p2.Y - p2.X * p1.Y
  Dim a2 As Integer = p3.Y - p4.Y, b2 As Integer = p4.X - p3.X, c2 As Integer = p3.X * p4.Y - p4.X * p3.Y
  Dim den As Integer = a1 * b2 - a2 * b1
  Return If(den, CType(New PointF((b1 * c2 - b2 * c1) / den, (c1 * a2 - c2 * a1) / den), PointF?), Nothing)
End Function
2
22.11.2013, 23:50

Не по теме:

Qwertiy, интересно. Никогда не встречал такой записи возвращаемого значения (с вопросительным знаком). Где почитать?

0
22.11.2013, 23:55

Не по теме:

Цитата Сообщение от ViterAlex Посмотреть сообщение
Никогда не встречал такой записи возвращаемого значения (с вопросительным знаком).
Сокращённая форма от Nullable(Of PointF). Тоже структура, кстати.
И обращаю внимание на явное приведение типа в условном операторе. А то уже наступал на эти грабли и долго разбирался, что за фигня. Кстати, если развернуть в if-else, то приведение уже не нужно:
VB.NET
1
2
  Return If(den, CType(New PointF((b1 * c2 - b2 * c1) / den, (c1 * a2 - c2 * a1) / den), PointF?), Nothing)
  If den Then Return New PointF((b1 * c2 - b2 * c1) / den, (c1 * a2 - c2 * a1) / den) Else Return Nothing

2
39 / 28 / 8
Регистрация: 14.04.2012
Сообщений: 249
23.11.2013, 13:38  [ТС]
Цитата Сообщение от Qwertiy Посмотреть сообщение
Вот так будет работать:
Ваш вариант выдаёт исключение System.InvalidOperationException
Нулевой объект должен иметь значение.

VB.NET
1
 pt = CrossPoint(New Point(0, kvY), New Point(kvX, kvY), New Point(tX1, tY1), New Point(tX2, tY2))
kvX 100 Integer
kvY 100 Integer
+ pt {X = 150.0 Y = 100.0} System.Drawing.PointF
tX1 200 Integer
tX2 100 Integer
tY1 200 Integer
tY2 200 Integer
0
 Аватар для ViterAlex
8953 / 4865 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
23.11.2013, 15:21
Исключение даёт не функция, а присвоение значения Nothing структуре. Использовать нужно немного по-другому:
VB.NET
1
2
3
4
5
6
        Dim pt As Object = CrossPoint(New Point(350, 300), New Point(100, 100), New Point(200, 200), New Point(100, 200))
        If pt Is Nothing Then
            MessageBox.Show("Прямые параллельны")
        Else
            MessageBox.Show(String.Format("Прямые пересекаются в точке {0}", CType(pt, PointF).ToString()))
        End If
0
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
23.11.2013, 17:26
Цитата Сообщение от ViterAlex Посмотреть сообщение
Исключение даёт не функция
Да.

Цитата Сообщение от ViterAlex Посмотреть сообщение
а присвоение значения Nothing структуре
Нет. Nothing можно присваивать чему угодно.
Исключение даёт оператор приведения типа из Nullable(Of PointF) в PointF.

Цитата Сообщение от ViterAlex Посмотреть сообщение
Dim pt As Object = CrossPoint(New Point(350, 300), New Point(100, 100), New Point(200, 200), New Point(100, 200))
Тоже плохо. Надо
VB.NET
1
2
Dim pt As PointF? = CrossPoint(New Point(350, 300), New Point(100, 100), New Point(200, 200), New Point(100, 200))
If pt.HasValue Then
Сравнения с Nothing не помню как работают в VB.NET - надо проверять.
1
39 / 28 / 8
Регистрация: 14.04.2012
Сообщений: 249
23.11.2013, 18:19  [ТС]
ViterAlex,
Ваш вариант работает без проблем.
A, переменную я определяю заранее, а потом уже присваиваю значение из функции и потом работаю с переменной и её значением.
0
 Аватар для ViterAlex
8953 / 4865 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
23.11.2013, 18:38
Цитата Сообщение от kostrorod Посмотреть сообщение
Ваш вариант работает без проблем.
Мой вариант не совсем правильный. Qwertiy, указал в чём проблема, за что ему искренняя благодарность
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.11.2013, 18:38

Определить, пренадлежит ли точка внутренней области треугольника
определить, пренадлежит ли точка М(x,y) внутренней области треугольника с вершинами А(0,a), B(b,0), С(с,0), где a,b, положительные числа

Определить принадлежит ли точка отрезку
Подскажите как записать функцию, для определения принадлежности точки прямой, вот функция сырая, не всегда правильно считает function...

Определить принадлежит ли точка С отрезку АВ
Помогите, пожалуйста, составить блок схему данной задачи Даны три точки А,В,С. Определить принадлежит ли точка С отрезку АВ. program...

Определить, принадлежит ли точка отрезку
На форме нарисовано несколько линий --.DrawLine(pen, x0, y0, x, y); Как найти, по клику мыши, что мы кликнули по линии, а не по форме?

Пренадлежит ли точка треугольнику
Треугольник задан координатами вершин. Определить, принадлежит ли точка M(x,y) треугольнику.


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru