Author Topic: Плагин ( DLL ) определяющий принадлежность точки многоугольнику.  (Read 2155 times)

0 Members and 2 Guests are viewing this topic.

ya12

  • Активный участник
  • ***
  • Posts: 165
    • View Profile
Code: (Delphi) [Select]
library poligon32;

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, stdctrls, extctrls;

// Основное тело функции, идет на экспорт, вызывается из кликера
function execute( _mas: pInteger; _size: Integer): Integer; export; stdcall;
type
  pIntArr = array[0..0] of Integer;
var
  bp:Tcanvas;
  pol: array of TPoint; //x,y - это массив указателей на координаты вершин (количество не известно). //Однако при большом количестве координат может быть затык, потому что при выделения памяти для //новой точки переписываются в новую область памяти все предыдущие

  btm: TBitMap;
  mc: integer; //цвет точки
  i: integer;  //счетчик в массиве указателей переданных в DLL (0-первый эл.)
  n: integer;  //счетчик вершин многоугольника в динамическом массиве(0-первая, 1-вторая и тд)
begin
  // _mas  - указатель на начало массива параметров integer
  // _size - размер массива (число параметров)
  btm := TBitMap.create;

  btm.Width:=pIntArr(_mas^)[_size-2];       //x
  btm.Height:=pIntArr(_mas^)[_size-1];      //y

  i:=2; //с него начинаются координаты вершин многоугольников
  n:=-1;
  with btm.Canvas do
  begin

    while pIntArr(_mas^)[i]<>-3 do
    begin
      if ((pIntArr(_mas^)[i]<>-2) and (pIntArr(_mas^)[i]<>-1))
      then
        begin
          n:=n+1;
          SetLength(pol, n+1);
          pol[n].X := pIntArr(_mas^)[i];
          pol[n].Y := pIntArr(_mas^)[i+1];
          //ShowMessage('i='+IntToStr(i+1)+' n='+IntToStr(n+1)+' x='+IntToStr(pol[n].X)+' y=' + IntToStr(pol[n].Y));
        end
      else
        begin
          //ShowMessage('i=' + IntToStr(i+1)); //i счет от 1
          if pIntArr(_mas^)[i]=-1 then
            begin
              Brush.Color:= clYellow;
              pen.Color := clYellow;
            end;
          if pIntArr(_mas^)[i]=-2 then
            begin
              Brush.Color:= clWhite;
              pen.Color := clWhite;
            end;
          Polygon(pol);
          n:=-1;
          pol:=nil;
        end;
      i:=i+2;
    end;
    mc:= Pixels[pIntArr(_mas^)[0], pIntArr(_mas^)[_size-_size+1]];//:=clRed;
  end;

  if pIntArr(_mas^)[i+1]=-4 then
  begin
    //просто красная точка малозаметна, рисуем красный крест
    btm.Canvas.Pixels[pIntArr(_mas^)[0], pIntArr(_mas^)[_size-_size+1]]:=clRed;
    btm.Canvas.Pixels[pIntArr(_mas^)[0]+1, pIntArr(_mas^)[_size-_size+1]]:=clRed;
    btm.Canvas.Pixels[pIntArr(_mas^)[0], pIntArr(_mas^)[_size-_size+1]+1]:=clRed;
    btm.Canvas.Pixels[pIntArr(_mas^)[0]-1, pIntArr(_mas^)[_size-_size+1]]:=clRed;
    btm.Canvas.Pixels[pIntArr(_mas^)[0], pIntArr(_mas^)[_size-_size+1]-1]:=clRed;
    bp:=Tcanvas.create();
    bp.Handle:=getDC(0);// присваиваем идентификатор контекста устройства вывода
    bp.Draw(1024,0,btm);
    bp.Free;
  end;

  btm.Free;

  if mc = 65535   //желтый
    then  result:= 1   //1-разрешенная область
    else  result:= 0;  //0-запрещенная область
end;
//------------------------------------------------------------------------------

// список экспорта
exports execute;

begin
  // тело пусто
end.




Code: (clickermann) [Select]
// в 0,1 элементе x,y-координаты точки (красный)
// предпоследний, последний элемент массива (Width,Height TBitMap) X,Y размеры полигона для рисования
//-1,-1 конец координат разрешенной области (желтый)
//-2,-2 конец координат запрещенной области (белый)
//-3 конец всех координат, если после него идет -4 будет вывод тестовой картинки на рабочий стол
//------------------------------------------------------------------------------
CALL("poligon32.dll",150,150,310,0,184,495,0,500,48,26,-1,-1,150,100,200,100,200,200,100,200,-2,-2,70,450,100,450,100,500,50,500,-2,-2,-3,-4,0,0,0,0,310,500)
print($_return1)
halt

Возвращает 1 если точка принадлежит разрешенной области и 0 - запрещенной.

ps Координаты должны лежать в положительной области. Точка 0,0 - верхний левый угол.
« Last Edit: September 26, 2018, 09:55:39 AM by ya12 »