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

Пожалуйста, будьте более конкретны. С какой информации вы должны начать? У вас есть упорядоченная пара точки и уравнения?

Bravery Onions 25 май 2009, в 16:58
Поделиться:

11 ответов

Лучший ответ

В простейшей форме просто вставьте координаты в линейное уравнение и проверьте равенство.

Point p (X=4, Y=5) Line l (Slope=1, YIntersect=1)

Подключите X и Y:

Y = Slope * X + YIntersect => 5 = 1 * 4 + 1 => 5 = 5

Итак, да, точка находится на линии.

Если ваши строки представлены в форме (X1, Y1), (X2, Y2), то вы можете рассчитать наклон с помощью:

Slope = (y1 — y2) / (x1-x2)

И затем получите Y-Intersect с этим:

YIntersect = — Slope * X1 + Y1;

Изменить: я установил Y-Intersect (который был X1/Y1. )

Вам нужно проверить, что x1 — x2 не 0 . Если это так, то проверка того, находится ли точка на линии, является простым вопросом проверки того, соответствует ли значение Y в вашей точке либо x1 , либо x2 . Кроме того, проверьте, что X точки не является «x1» или «x2».

Определить принадлежит ли точка области Д371

Eclipse 25 май 2009, в 18:24
Поделиться
Что это за языковая библиотека?
Autodidact 25 май 2009, в 17:20
Это не так — это просто псевдокод.
Eclipse 25 май 2009, в 17:48
Это даже не псевдокод — это просто математика.
configurator 25 май 2009, в 18:12

Да, в значительной степени.
Eclipse 25 май 2009, в 18:52

Я бы подумал о перемещении EDIT: исправление формулы Y-Intersect поверх оригинальной неверной версии. Взял второе чтение, чтобы заметить это.

jacob 17 сен. 2012, в 22:31

Самый простой способ — сравнить результаты Math.Atan2 как начальной, так и конечной точек сегмента с предметной точкой. Смотрите мой ответ ниже для примера. Не беспокойтесь о горизонтальных или вертикальных проблемах или о том, насколько близок к нулю до его нуля метод присвоения slope-intercept пересечения.

IAbstract 01 апр. 2016, в 23:59
Показать ещё 4 комментария

Я только что написал функцию, которая обрабатывает несколько дополнительных требований, поскольку я использую эту проверку в приложении для рисования:

  • Fuzziness. Должно быть место для ошибки, поскольку функция используется для выбора строк, нажимая на них.
  • Линия получила EndPoint и StartPoint, без бесконечных строк.
  • Должен обрабатывать прямые вертикальные и горизонтальные линии, (x2 — x1) == 0 вызывает деление на ноль в других ответах.

private const double SELECTION_FUZZINESS = 3; internal override bool ContainsPoint(Point point) < LineGeometry lineGeo = geometry as LineGeometry; Point leftPoint; Point rightPoint; // Normalize start/end to left right to make the offset calc simpler. if (lineGeo.StartPoint.X else < leftPoint = lineGeo.EndPoint; rightPoint = lineGeo.StartPoint; >// If point is out of bounds, no need to do further checks. if (point.X + SELECTION_FUZZINESS < leftPoint.X || rightPoint.X < point.X — SELECTION_FUZZINESS) return false; else if (point.Y + SELECTION_FUZZINESS < Math.Min(leftPoint.Y, rightPoint.Y) || Math.Max(leftPoint.Y, rightPoint.Y) < point.Y — SELECTION_FUZZINESS) return false; double deltaX = rightPoint.X — leftPoint.X; double deltaY = rightPoint.Y — leftPoint.Y; // If the line is straight, the earlier boundary check is enough to determine that the point is on the line. // Also prevents division by zero exceptions. if (deltaX == 0 || deltaY == 0) return true; double slope = deltaY / deltaX; double offset = leftPoint.Y — leftPoint.X * slope; double calculatedY = point.X * slope + offset; // Check calculated Y matches the points Y coord with some easing. bool lineContains = point.Y — SELECTION_FUZZINESS
Robin Andersson 06 дек.

2012, в 11:44
Поделиться

33 Задача: Принадлежит ли точка кругу с центром в начале координат?

Почему это не принятый ответ? Все остальные просто математика и бла. Это реальный мир, закаленный в боях, и его следует отдавать предпочтение.

Читайте также:
Лучшие программы для геймпада

Я имею в виду это StackOverflow ради бога, а не MathOverflow.

Robinicks 18 фев. 2014, в 15:49
это лучший ответ, спасибо, это работает. но что будет лучшим значением для SELECTION_FUZZINESS ??
shakil.k 20 май 2016, в 05:33
Pierre-Luc 11 май 2019, в 13:23
Показать ещё 1 комментарий

Лучший способ определить, находится ли точка R = (rx, ry) на линии, соединяющей точки P = (px, py) и Q = (qx, qy), — проверить, является ли определитель матрицы

а именно (qx — px) * (ry — py) — (qy — py) * (rx — px) близок к 0. Это решение имеет несколько связанных преимуществ над остальными: во-первых, он не требует особого случая для вертикальных линий, во-вторых, он не делит (как правило, медленную операцию), в-третьих, он не вызывает плохое поведение с плавающей точкой, когда линия почти, но не совсем вертикальная.

Dave 25 май 2009, в 18:28
Поделиться
Для линии от 0,0 до 10,10 с точкой 5.1, 5.1 определитель равен нулю. Но дело не в линии.
Andy 14 апр.

2013, в 10:00
что именно означает «близко к 0»?
Leggy7 02 янв. 2014, в 08:49

Это гораздо лучший ответ, чем «принятый». Единственное, чего не хватает, так это определения «близко к». Это должно быть понято в контексте вычитаемых чисел: поскольку есть 5 вычитаний, есть 5 возможностей для «значительной потери точности», что означает, что на самом деле довольно трудно поставить хорошую спецификацию на «близко к».

Floris 28 фев. 2014, в 05:31
Tomas Aschan 13 май 2014, в 13:37
Показать ещё 2 комментария

Я думаю, что мистер Патрик Макдональд поставил почти правильный ответ, и это исправление его ответа:

public bool IsOnLine(Point endPoint1, Point endPoint2, Point checkPoint) < return (((double)checkPoint.Y — endPoint1.Y)) / ((double)(checkPoint.X — endPoint1.X)) == ((double)(endPoint2.Y — endPoint1.Y)) / ((double)(endPoint2.X — endPoint1.X)); >

и, конечно, есть много других правильных ответов, особенно Mr.Josh, но я нашел, что это лучший.

Thankx для evryone.

Wahid Bitar 25 май 2009, в 19:14
Поделиться

Дает вам деление на ноль, если checkPoint.x == endPoint.x или если конечные точки имеют одинаковое значение x

ThiefMaster 16 окт. 2010, в 12:49

Учитывая две точки на линии L0 и L1 и точку для проверки P .

(L1 — L0) * (P — L0) n = (P — L0) — ——————— (L1 — L0) (L1 — L0) * (L1 — L0)

Нормой вектора n является расстояние от точки P от линии до L0 и L1 . Если это расстояние равно нулю или достаточно мало (в случае ошибок округления), точка лежит на линии.

Символ * представляет точечный продукт.

Пример

P = (5, 5) L0 = (0, 10) L1 = (20, -10) L1 — L0 = (20, -20) P — L0 = (5, -5) (20, -20) * (5, -5) n = (5, -5) — ——————— (20, -20) (20, -20) * (20, -20) 200 = (5, -5) — — (20, -20) 800 = (5, -5) — (5, -5) = (0, 0)
Daniel Brückner 25 май 2009, в 17:58
Поделиться

+1 за упоминание ошибок округления. Использование точного равенства в арифметике с плавающей точкой во многих случаях приведет к сбою других предложенных решений.

Я не уверен насчет числовой надежности предложенного алгоритма, но числовая надежность достаточно сложна, поэтому, если важна точность, тогда желательно взглянуть на научную литературу по этой теме. Или, по крайней мере, используйте библиотеку, в которой, вероятно, автор провел исследование.

Ants Aasma 25 май 2009, в 21:32

Я не думаю, что ваш пример верен, потому что после некоторых преобразований n = (p — L0) — (p — L0) и в каждом случае, который вы имеете, вы всегда получите n = (0, 0) .

nenito 07 янв. 2012, в 09:47

y = m * x + c

Это уравнение линии. x и y — координаты. Каждая линия характеризуется своим наклоном (m) и где она пересекает ось y (c).

Таким образом, для m и c для строки вы можете определить, находится ли точка (x1, y1) на линии, проверяя, выполняется ли уравнение для x = x1 и y = y1

Gishu 25 май 2009, в 17:11
Поделиться

За исключением того, что это уравнение не может описать вертикальную линию, и кроме того, что вы не упомянули возможность того, что линия имеет ненулевую толщину.

ChrisW 25 май 2009, в 17:04
Линия не имеет толщины.
Willie Wheeler 25 май 2009, в 18:12

«Линия не имеет толщины» — это происходит, когда она рисуется на экране (т.е. когда это вопрос программирования): ее толщина составляет не менее одного пикселя и может быть больше.

Читайте также:
Как зарегистрировать программу спасибо от Сбербанка

ChrisW 25 май 2009, в 19:01

Я бы посчитал линию толщиной 1 пиксель (при рисовании на экране), которая работает с этим уравнением. Если вы хотите узнать, находится ли точка в линии с толщиной X, вы действительно спрашиваете, находится ли точка в прямоугольнике.

ebrown 26 май 2009, в 17:57
Показать ещё 2 комментария

Если у вас есть строка, определяемая ее конечными точками

PointF pt1, pt2;

и у вас есть точка, которую вы хотите проверить

PointF checkPoint;

то вы можете определить функцию следующим образом:

bool IsOnLine(PointF endPoint1, PointF endPoint2, PointF checkPoint) < return (checkPoint.Y — endPoint1.Y) / (endPoint2.Y — endPoint1.Y) == (checkPoint.X — endPoint1.X) / (endPoint2.X — endPoint1.X); >

и назовите его следующим образом:

if (IsOnLine(pt1, pt2, checkPoint) < // Is on line >

Вам нужно будет проверить деление на ноль.

Patrick McDonald 25 май 2009, в 18:48
Поделиться

Это не может быть правильно . Поскольку координаты точки являются целыми, у вас будет (критическая) потеря разрешения, когда контрольная точка близка к конечной точке1 и далека от конечной точки2. Возможно, если вы измените его на десятичное или двойное, оно будет хорошо работать для обеих сторон, но я все равно не буду доверять точности этого уравнения.

configurator 25 май 2009, в 18:15
Fair Point (каламбур), изменил их на PointF
Patrick McDonald 26 май 2009, в 09:12

Осталось две проблемы: вы не проверяли конец строки, поэтому (4,6) будет между (1,2) и (3,4) в соответствии с этой функцией, и есть проблема точности — предположим, линия идет от (1100) до (2200). В центре нет ни одной точки с целочисленными координатами — проверка всегда будет ложной для целочисленных координат.

configurator 28 май 2009, в 11:33
java.lang.ArithmeticException: делить на ноль — НЕ ОК
MSA 25 июнь 2013, в 11:57

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

diegoaguilar 17 нояб. 2013, в 08:16
Показать ещё 3 комментария

Двумерная линия обычно представляется с использованием уравнения с двумя переменными x и y здесь является хорошо известным уравнением

Изображение 134914

Теперь представьте, что ваша линия GDI + нарисована от (0,0) до (100, 100), тогда значение m = (0-100)/(0-100) = 1, таким образом, уравнение для вашей линии y- 0 = 1 * (x-0) = > y = x

Теперь, когда у нас есть уравнение для рассматриваемой линии, его легко проверить, принадлежит ли точка этой строке. Данная точка (x3, y3) принадлежит этой строке, если она удовлетворяет линейному уравнению при подстановке x = x3 и y = y3. Например, точка (10, 10) принадлежит этой линии, так как 10 = 10, но (10,12) не принадлежит этой линии, так как 12!= 10.

ПРИМЕЧАНИЕ. Для вертикальной линии значение наклона (m) бесконечно, но для этого частного случая вы можете использовать уравнение для вертикальной прямой непосредственно x = c, где c = x1 = x2.

Хотя я должен сказать, что не уверен, что это самый эффективный способ сделать это. Я постараюсь найти более эффективный способ, когда у меня будет больше времени.

Надеюсь, что это поможет.

Источник: overcoder.net

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

Составить программу на языке Си, которая выводит на экран сообщение «Точка с координатами X:___ и Y:____ принадлежит выделенной области» или «Точка с координатами X:___ и Y:___ не принадлежит выделенной области». Выделенная область задана на рисунке(заштрихована). Криволинейная граница означает распространение допустимой области до бесконечности по соответствующим осям. Координаты точки X и Y вводятся с клавиатуры. Точка может лежать на границе.Проверить, принадлежит ли точка заштрихованной области.F8RVYhO_7Ik.jpg

Регистрация: 17.11.2010
Сообщений: 19,042

Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Регистрация: 19.12.2017
Сообщений: 2
А саму программу с нуля не поможете написать?) Буду очень благодарен
Регистрация: 16.05.2012
Сообщений: 3,211
А саму программу с нуля не поможете написать?)

1) Для начала возьмите книжку/методичку по с++. Затем внимательно изучите синтаксис языка, описание типов, операторов (таких, как условные операторы, операторы цикла и т.п.).

2) Составьте алгоритм решения конкретной задачи на бумажке (можно даже с блок-схемой)

3) Затем берёте все полученные в п. 1 знания и пишете программу, реализующую алгоритм из п. 2.

Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы.

Читайте также:
В какой день недели шла программа в гостях у сказки

Источник: www.programmersforum.ru

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » Принадлежит ли точка с координатами (x, y) заштрихованной фигуре

#1 Окт. 21, 2020 14:47:45

Принадлежит ли точка с координатами (x, y) заштрихованной фигуре

Добрый день, подскажите пожалуйста как решить задачу: Выяснить, принадлежит ли точка с координатами (x, y) заштрихованной фигуре

attachment

Прикреплённый файлы:
2020-10-21_124757.png (4,8 KБ)

#2 Окт. 21, 2020 19:45:17

Принадлежит ли точка с координатами (x, y) заштрихованной фигуре

Это система неравенств.

#3 Окт. 24, 2020 10:22:47

Принадлежит ли точка с координатами (x, y) заштрихованной фигуре

не решение вашей задачи но очень похожее на вашу
правда на си
но тут перделать на питон не сложно


1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например) , нажмите и вставьте ссылку на его url

есчщо

#4 Окт. 24, 2020 11:58:26

Принадлежит ли точка с координатами (x, y) заштрихованной фигуре

AD0DE412
не решение вашей задачи но очень похожее на вашу
правда на си
но тут перделать на питон не сложно

Ты бы решил бы ему задачу на питоне. Она решается очень просто.

AD0DE412
правда на си

Это борландовский диалект. Можно нахвататься такой мути и потом думать, что на C пишешь.
Но на C нельзя писать

void main(void)

Да и функции getch() нет в C.
И чтобы это знать, нужно изучать сам C, потому что борладновский диалект уже устарел, так как использовался в DOS.

#5 Окт. 24, 2020 17:26:11

Принадлежит ли точка с координатами (x, y) заштрихованной фигуре

меня так учат … хотя … намекните как правильно …
зы заранее спсб

1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например) , нажмите и вставьте ссылку на его url

есчщо

#6 Окт. 24, 2020 19:21:07

Принадлежит ли точка с координатами (x, y) заштрихованной фигуре

py.user.next
Да и функции getch() нет в C.

#7 Окт. 25, 2020 00:48:32

Принадлежит ли точка с координатами (x, y) заштрихованной фигуре

FishHook
вроде есть

Это функция getchar(), которая может быть и макросом (макросы нельзя сохранять в указатели на функции и передавать, соответственно, в другие функции). А getch() — это функция Borland C++ Compiler (сокращённо bcc).
https://ru.wikipedia.org/wiki/Borland_C%2B%2B
То есть если ты код с этой функцией захочешь скомпилировать в другом компиляторе, то там может быть функция getch(), а может и не быть её. Так и ещё если она там даже есть, то она не обязана работать точно так же, как в Borland C++ Compiler, и запросто может иметь другое поведение. В каждом компиляторе может быть собственная функция getch() с собственным поведением.
Поэтому эту штуку никто не использует, даже если есть такая возможность. Стандарт языка C точно описывает поведение функции/макроса getchar(), что в итоге скомпилирует её/его одинаково любым компилятором. А функции getch() вообще нет в стандарте языка C.

AD0DE412
меня так учат … хотя … намекните как правильно …
зы заранее спсб

Вот с этого у тебя должно всё начинаться

int main(void)
return 0;
>
Обрати внимание, что скобочки пустые делать ты не можешь
int main()
return 0;
>

Потому что это не равносильно void. Пустые скобки задействуют вариант языка C, который был до стандарта C89 — то есть старый стиль определения функции.

При этом ты часто можешь видеть в современных кодах

int main()
return 0;
>

А почему ты видишь это, хотя это неправильно? Потому что ты видишь код не языка C, а код языка C++, в котором пустота равносильна void.

Так что если ты хочешь заниматься языком C, тебе надо сначала разделить между собой языки C и C++. Не изучать так называемый “язык C/C++”; это путь очень плохой, что видно на многочисленных глупостях, исходящих даже от профессионалов разработки (не зная разницы между языками, они часто переносят тупые правила с языка C++ на язык C, которых в языке C нет и не было никогда). А после разделения C и C++ тебе нужно разделить язык C на стандарты языка C. Есть Khttps://python.su/forum/topic/39569/?page=1″ target=»_blank»]python.su[/mask_link]

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru