martes, 24 de noviembre de 2015

saber si esta dentro de una zona GPS

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, strutils;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  rectas: array[1..4] of string;

  puntosX: array[1..4] of integer;
  puntosY: array[1..4] of integer;

implementation

{$R *.dfm}


//********************************************************
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
pX, pY: real;

desde, hasta: integer;

puntoOrdenado1, puntoOrdenado2: real;
denominador1, denominador2: real;
numerador, total: real;

corta: integer;

begin

  pX:=4;
  pY:=38.5596881;

  corta:=0;    // las veces que corta por arriba un punto dado
  desde:=1;    // los segmentos de la zona el primero
  hasta:=4;    //
los segmentos de la zona el ultimo (en este ej.)
  //***
  for i := desde to hasta do
  begin

    if i<>4 then
    begin

        puntoOrdenado1:=puntosX[i];
        puntoOrdenado2:=puntosX[i+1];
       
        if (puntoOrdenado1>puntosX[i+1]) then
        begin
          puntoOrdenado1:=puntosX[i+1];
          puntoOrdenado2:=puntosX[i];
        end;

        if ((puntoOrdenado1<=pX) and (puntoOrdenado2>=pX)) then
        begin
          




    // ecuaciones de la recta  ((X - Xa) / (Xb - Xa)) = ((Y - Ya) / (Yb - Ya))


          numerador:=pX - puntosX[i+1];


          denominador1:= puntosX[i+1] - puntosX[i];
          denominador2:= puntosY[i+1] - puntosY[i];

          total:= (numerador * denominador2 / denominador1) +  puntosY[i+1];

          if total >= pY then
          begin
            corta:=corta+1;
          end;

          //showmessage(floattostr(total));

        end;

    end
    else
    begin

        puntoOrdenado1:=puntosX[desde];
        puntoOrdenado2:=puntosX[hasta];

        if (puntoOrdenado1>puntosX[hasta]) then
        begin
          puntoOrdenado1:=puntosX[hasta];
          puntoOrdenado2:=puntosX[desde];
        end;

        if ((puntoOrdenado1<=pX) and (puntoOrdenado2>=pX)) then
        begin

          numerador:=pX - puntosX[hasta];

          denominador1:= puntosX[hasta] - puntosX[desde];
          denominador2:= puntosY[hasta] - puntosY[desde];

          total:= (numerador * denominador2 / denominador1) +  puntosY[hasta];

          if total >= pY then
          begin
            corta:=corta+1;
          end;

          //showmessage(floattostr(total));

        end;

    end;

  end;


//  ShowMessage(inttostr(corta));

  if (corta mod 2 <> 0)  then
  begin
    ShowMessage('Dentro');
  end
  else
  begin
    ShowMessage('Fuera');
  end;


//  ShowMessage(floattostr(corta mod 2));


end;





//********************************************************
procedure TForm1.FormCreate(Sender: TObject);
begin


// vertices de la zona  (-5,3)   (6,9)   (3,5)   (9,-3)


puntosX[1]:=-5;
puntosX[2]:=6;
puntosX[3]:=3;
puntosX[4]:=9;


puntosY[1]:=3;
puntosY[2]:=9;
puntosY[3]:=5;
puntosY[4]:=-3;

end;




end.










http://es.onlinemschool.com/math/assistance/cartesian_coordinate/p_to_line/
http://fooplot.com



.

No hay comentarios: