El 22/10/2016 a las 11:59, Ryan Joseph escribió:

j := i + 1;
might want this at the end of the loop.
Doing that defiantly broke it. I think “j” is being set inside the for() 
construct and before each pass of the loop. The author explains the for loop 
even but the fact it requires an explanation makes my worry about how easy it 
is to mess up. :)

Hello,

It is at the end of the loop for sure, it points to the "previous" point in the polygon and in the case of the first testing point the "previous" one is the last one.

So the correct code is:

  j := i;

This is my automated C code conversion for that function:

function pnpoly(nvert: Integer; vertx: PointerTo_Single; verty: PointerTo_Single; testx: Single; testy: Single): Integer;
var
  c: Integer = 0;
  j: Integer = 0;
  i: Integer = 0;
begin
  {INITCODE} c := 0;
  {INITCODE} j := 0;
  {INITCODE} i := 0;
  i := 0;
  j := nvert - 1;
  while i < nvert do
  begin
    if IsTrue(IsTrue(((verty[i] > testy) <> (verty[j] > testy)))
      AND
      IsTrue((testx < (vertx[j] - vertx[i]) * (testy - verty[i])
             div  (verty[j] - verty[i]) + vertx[i]))) then
    begin
      c := BooleanNot (c);
    end;
    j := PostInc(i);
  end;
  exit (c);
end;


--

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to