Как поразить тестовые фигуры в Silverlight? - PullRequest
1 голос
/ 25 января 2012

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

  • Точка 3 - сталкивается со звездой
  • Точка 2 - сталкивается с бриллиантом
  • Точка 1 - сталкивается с кругом

enter image description here

Учитывая это, я хотел бы знать, есть ли встроенный способ сделать то, что нужно.

Ответы [ 2 ]

0 голосов
/ 01 марта 2012

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

Для полигонов я адаптировал упомянутый код C http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes /pnpoly.html для работы в C #.

int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy)
{
  int i, j, c = 0;
  for (i = 0, j = nvert-1; i < nvert; j = i++) {
    if ( ((verty[i]>testy) != (verty[j]>testy)) &&
     (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
       c = !c;
  }
  return c;
}

Для эллипсов я адаптировал этот код: http://msdn.microsoft.com/en-us/library/aa231172%28v=vs.60%29.aspx

BOOL CCircCtrl::InCircle(CPoint& point)
{
    CRect rc;
    GetClientRect(rc);
    GetDrawRect(&rc);

    // Determine radii
    double a = (rc.right - rc.left) / 2;
    double b = (rc.bottom - rc.top) / 2;

    // Determine x, y
    double x = point.x - (rc.left + rc.right) / 2;
    double y = point.y - (rc.top + rc.bottom) / 2;

    // Apply ellipse formula
    return ((x * x) / (a * a) + (y * y) / (b * b) <= 1);
}
0 голосов
/ 26 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...