Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Распознование фигуры в Picturebox, Как распознать фигуры в Picturebox 
V
    Опции темы
htzg
Дата 1.9.2014, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.4.2010

Репутация: нет
Всего: нет



Привет!
На Picturebox рисую "ячейки" - замкнутые четырехугольные полигоны залитые цветом. 
Ячейки имеют разную форму, прилегают вплотную друг к другу, не перекрывают друг друга, имеют индекс типа int и значение типа float (цвет вычисляется из значения).
В общем будет визуализирован один слой вот этого:
user posted image



Вопрос: как определить индекс ячейки, на который наведена мышь?

Спасибо!
PM MAIL   Вверх
jonie
Дата 1.9.2014, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата(htzg @  1.9.2014,  17:12 Найти цитируемый пост)

Вопрос: как определить индекс ячейки, на который наведена мышь?

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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
htzg
Дата 2.9.2014, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.4.2010

Репутация: нет
Всего: нет



Цитата(jonie @ 1.9.2014,  18:08)
Цитата(htzg @  1.9.2014,  17:12 Найти цитируемый пост)

Вопрос: как определить индекс ячейки, на который наведена мышь?

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

Гениально! 
Все работает!  smile 
Прикладываю ф-ю:
Код

bool IsPointInsidePolygon(PointF[] p, float x, float y)
{
    int i1, i2, N;
    float  S, S1, S2, S3;
    bool flag = false;
    N = p.Length;
    for (int n = 0; n < N; n++)
    {
        flag = false;
        i1 = n < N - 1 ? n + 1 : 0;
        while (!flag)
        {
            i2 = i1 + 1;
            if (i2 >= N)
                i2 = 0;
            if (i2 == (n < N - 1 ? n + 1 : 0))
                break;
            S = Math.Abs(p[i1].X * (p[i2].Y - p[n].Y) +
                        p[i2].X * (p[n].Y - p[i1].Y) +
                        p[n].X * (p[i1].Y - p[i2].Y));
            S1 = Math.Abs(p[i1].X * (p[i2].Y - y) +
                        p[i2].X * (y - p[i1].Y) +
                        x * (p[i1].Y - p[i2].Y));
            S2 = Math.Abs(p[n].X * (p[i2].Y - y) +
                        p[i2].X * (y - p[n].Y) +
                        x * (p[n].Y - p[i2].Y));
            S3 = Math.Abs(p[i1].X * (p[n].Y - y) +
                        p[n].X * (y - p[i1].Y) +
                        x * (p[i1].Y - p[n].Y));
            if (S == S1 + S2 + S3)
            {
                flag = true;
                break;
            }
            i1 = i1 + 1;
            if (i1 >= N)
                i1 = 0;
        }
        if (!flag)
            break;
    }
    return flag;
}

PM MAIL   Вверх
htzg
Дата 2.9.2014, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.4.2010

Репутация: нет
Всего: нет



хотя вот эта работает, на мой взгляд,  лучше
Код

       int SearchRightPoint(List<PointF> points)
        {
            PointF right = points[0];
            int num = 0;
            for (int i = 1; i < points.Count; ++i)
                if (points[i].X > right.X)
                {
                    right = points[i];
                    num = i;
                }
            return num;
        }

        int CheckIntersection(PointF a1, PointF a2, PointF b1, PointF b2)
        {
            float eps = 0.000001f;
            float d = (a1.X - a2.X) * (b2.Y - b1.Y) - (a1.Y - a2.Y) * (b2.X - b1.X);
            float da = (a1.X - b1.X) * (b2.Y - b1.Y) - (a1.Y - b1.Y) * (b2.X - b1.X);
            float db = (a1.X - a2.X) * (a1.Y - b1.Y) - (a1.Y - a2.Y) * (a1.X - b1.X);
            if (Math.Abs(d) < eps)
                return 0;
            else
            {
                float ta = da / d;
                float tb = db / d;
                if ((Math.Abs(ta) < eps) && ((0 <= tb) && (tb <= 1)))
                    return 2;
                else
                    if ((0 <= ta) && (0 <= tb) && (tb <= 1))
                        return 1;
                    else return -1;
            }
        }


        bool IsInside(PointF a, List<PointF> plg)
        {
            PointF ax = new PointF(a.X + plg[SearchRightPoint(plg)].X, a.Y);
            int k = 0;
            int i1;
            int i2;
            int r;
            for (int i = 0; i < plg.Count; i++)
            {
                i1 = i;
                i2 = i + 1;
                if (i == plg.Count - 1) i2 = 0;

                r = CheckIntersection(a, ax, plg[i1], plg[i2]);
                if (r == 2)
                {
                    return false;
                }
                if (r == 1)
                    k = 1 - k;
            }
            if (k == 0)
                return false;
            else
                return true;
        }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0675 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.