VB+API как определить принадлежность точки фигуре?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
dragornuss
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 04.08.2005 (Чт) 14:15

VB+API как определить принадлежность точки фигуре?

Сообщение dragornuss » 04.08.2005 (Чт) 14:21

Рисуются несколько закрашенных треугольников с известными координатами вершин. Юзер кликает на любом месте окна.
Задача определить на каком именно треугольнике был клик и вообще на треугольнике ли ?
Хелп, очень надо !

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 04.08.2005 (Чт) 14:24

А треугольники пересекаются между собой?
Проще всего использовать API PtInRegion
Lasciate ogni speranza, voi ch'entrate.

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 04.08.2005 (Чт) 14:38

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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.08.2005 (Чт) 14:54

Ну стандартными методами определи, в каком из нескольких треугольников находится курсор.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 04.08.2005 (Чт) 15:02

но если тебе извесны координаты вершин, то можно посчитать чисто математически, а потом сравнить с результатами X и Y

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 04.08.2005 (Чт) 15:03

lord0n писал(а):но как насчет определения местоположения курсора стандартными методами?

Какие стандартные методы? Если ты о функции CheckPointCrossMyMulticolorTriangles, то такой функции нет. Но ее легко написать самому на основе PtInRegion.
Lasciate ogni speranza, voi ch'entrate.

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 04.08.2005 (Чт) 15:14

alibek писал(а):
lord0n писал(а):но как насчет определения местоположения курсора стандартными методами?

Какие стандартные методы? Если ты о функции CheckPointCrossMyMulticolorTriangles, то такой функции нет. Но ее легко написать самому на основе PtInRegion.


я про стандартные методы формы: MouseMove, MouseDown, MouseUp

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 04.08.2005 (Чт) 15:16

alibek писал(а):
lord0n писал(а):но как насчет определения местоположения курсора стандартными методами?

Какие стандартные методы? Если ты о функции CheckPointCrossMyMulticolorTriangles, то такой функции нет. Но ее легко написать самому на основе PtInRegion.


я про стандартные методы формы: MouseMove, MouseDown, MouseUp
или я действительно чета не понимаю
где рисуют треугольники?

прошу прощения что написал дважды :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.08.2005 (Чт) 15:27

Треугольники уже нарисованы.
Задача определить, в каком из них находится указанная точка.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 04.08.2005 (Чт) 15:27

Я так понял, что человеку не нужно знать, какие именно координаты у курсора, ему надо знать, совпадают ли эти координаты с треугольником.
Lasciate ogni speranza, voi ch'entrate.

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 04.08.2005 (Чт) 15:33

alibek писал(а):Я так понял, что человеку не нужно знать, какие именно координаты у курсора, ему надо знать, совпадают ли эти координаты с треугольником.


а я о чем:
sub mousedown(x, y)
if х и у курсора = положению треугольника then msgbox("Попал")
end sub

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 04.08.2005 (Чт) 15:37

я про стандартные методы формы: MouseMove, MouseDown, MouseUp

Картина получается такая:
1. Нужно создать регионы треугольников (столько, сколько надо) с помощью CreatePolygonRgn и нарисовать их (PaintRgn).
2. по Click на форме (точнее на том, где нарисованы) узнаем координаты мыши в пикселях относительно того DC, на котором мы рисовали, и с помощью PtInRegion узнаем, где кликнули...
Последний раз редактировалось Twister 04.08.2005 (Чт) 15:38, всего редактировалось 1 раз.
А я все практикую лечение травами...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.08.2005 (Чт) 15:37

Вот "= положению треугольника" и попробуй сделай.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

schalexey
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 18.02.2005 (Пт) 17:41
Откуда: Сургут

Сообщение schalexey » 04.08.2005 (Чт) 15:44

хех.. довольнотаки не сложная задачка (решал такую в DX, при работе с объектами произвольной формы) и так... можно использовать примерно следующее:
как я понял рисуются они на самой форме... тода можно добавить picturebox в котором прорисовывать теже фигуры но уже одним каким-то выбранным цветом, причем для различных фигур цвет свой, потом инфо о каждой фигуре можно сохраниьт в какой-нибудь переменной (например колекции содержащей переменные своего типа, а key-ем будет код цвета).
дальше при нажатии на форме определяем положение мыши и берем цвет точки из нашего picturebox после чего запрашиваем всю что нам надо из коллекции по данному цвету и делаем все что дальше надо..

ЗЫ к примеру область не занетую фигурами можно закрашивать в черный.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 04.08.2005 (Чт) 15:48

Имхо, гимор... :wink:
А я все практикую лечение травами...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 04.08.2005 (Чт) 15:49

schalexey писал(а):как я понял рисуются они на самой форме... тода можно добавить picturebox в котором прорисовывать теже фигуры но уже одним каким-то выбранным цветом, причем для различных фигур цвет свой, потом инфо о каждой фигуре можно сохраниьт в какой-нибудь переменной (например колекции содержащей переменные своего типа, а key-ем будет код цвета).

Не эффективно. Фигуры ведь треугольники, их несложно проверить и математически.
Lasciate ogni speranza, voi ch'entrate.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 04.08.2005 (Чт) 15:59

В свое время, еще на районной олимпиаде по QuickBasic-у, у меня была такая же задача (принадлежит ли точка треугольнику), я решил ее так: рисовал на экране треугольник, сначала проверял ни является ли заданная точка того же цвета, что и граница треугольника (если да, значит пренадлежит), потом двигался по циклу влево, при обнаружении точки цвета границы, начинал двигаться вправо. Короче говоря, если я два раза натыкался на точку нужного цвета - значит точка в треугольнике, если не натыкался, значит нет...
Как видите с математикой тогда у меня трудно было. Сейчас не лучше, я до сих пор не знаю как чисто математически решить эту задачу :oops: . Мож кто просветит неуча?...
А я все практикую лечение травами...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 04.08.2005 (Чт) 16:00

Треугольник состоит из трех линий. Составляешь уравнение для каждой линии; если для всех трех линий выполняется условие "точка левее (правее) линии", значит точка внутри треугольника.
Lasciate ogni speranza, voi ch'entrate.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 04.08.2005 (Чт) 16:02

Так вот оно как? :lol: Блин, вот я осел!...
Как говорится, все генетальное просто...
А я все практикую лечение травами...

schalexey
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 18.02.2005 (Пт) 17:41
Откуда: Сургут

Сообщение schalexey » 04.08.2005 (Чт) 16:04

Twister то что гемор эт да... но когда объект не описать математически (использовались картинки с объектом и маской), то эт наверно единственный способ.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 04.08.2005 (Чт) 16:08

но когда объект не описать математически (использовались картинки с объектом и маской)

Ну тут я еще соглашусь, но с треугольниками так извращаться не стоит... :wink:
А я все практикую лечение травами...

AlexBlack
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 18.07.2005 (Пн) 19:14
Откуда: Киефф, Юкрейн...

Сообщение AlexBlack » 04.08.2005 (Чт) 16:40

А может просто попробовать GetPixel?
Сначала раскрасить разными цветами, а при нажатии на кнопку проверяем if GetPixel(X,y) = SelectColor then msgbox "Попал"

??

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 04.08.2005 (Чт) 16:44

А если треугольник не закрашен, а есть только граница? Читай мой пост про олимпиаду (выше)...
А я все практикую лечение травами...

schalexey
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 18.02.2005 (Пт) 17:41
Откуда: Сургут

Сообщение schalexey » 04.08.2005 (Чт) 17:43

AlexBlack эт я уже предлагал... эт луче в других случаях использовать...

AlexBlack
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 18.07.2005 (Пн) 19:14
Откуда: Киефф, Юкрейн...

Сообщение AlexBlack » 04.08.2005 (Чт) 18:30

гм. Помоему так легче всего. Или математическими вычислениями.

dragornuss
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 04.08.2005 (Чт) 14:15

Сообщение dragornuss » 04.08.2005 (Чт) 19:06

Для начала, большое спасибо всем ответившим. Не ожидал такой быстрой и нужной реакции.
Слава богу и я не совсем отупел. Просто у меня по API только справочники, а не учебники. Поэтому приходится искать методом тыка или используя смысловой английский.
После того как запостил часа через 2 нашёл, что хотел - PtInRegion !
А до этого потратил в поисках весь день и отчаявшись пошёл на форум :cry:

В кратце поясню для чего это всё нужно и задам ещё один вопрос ;)

Пишу карту объекта. Нужно чтобы при клике на сооружении выводилась инфа о нём (адрес, тел и т.д.) Для этого и нужно определение какой фигуре принадлежит точка под курсором.
Карта должна масштабироваться.
Вопрос, может кто знает где взять готовую библиотеку по созданию масштабируемой карты ?
Нашёл что-то типа mapinfo, но за неё денег хотят :(

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 05.08.2005 (Пт) 9:12

Вот пример определения принадлежности точки произвольному многоугольнику (скачано с алголиста или алматча - не помню точно откуда).
Надеюсь, поможет
Вложения
Polygon.rar
Покликайте по форме раз пять - потом на соотв. кнопку - получите результ.

Всё написанное - повторюсь - не мой ©.
(1.99 Кб) Скачиваний: 62
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 06.08.2005 (Сб) 0:06

Решим проблему на корню ! :roll: :D

Тока не кидайте помидорами. :roll: :wink: :idea:
Вложения
test.rar
(2.28 Кб) Скачиваний: 62


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 103

    TopList