A gdyby tak... będe gdybał, więc mogę nię trafić, ale moze komus cos podpowiem... Może gdyby tak to wszystko rozciągnąć... Powiedzmy dwukrotnie w pionie i poziomie, to wtedy okazałoby się, że grubość scieżki nie rzutuje, bo pomiędzy równoległymi liniami pojawiaja się puste przestrzenie. Tylko trzebaby jakoś wcześniej zapisać kształt wielokąta (przebytej ściezki) i uzupełnić po rozciągnięciu ... Czy to coś komus da... Pociągnijcie w tę stronę... Mi się wydaje, że trafiłem. Wtedy nie powinien sie algorytm wykrzaczyc, bo okaże się, że zamknięty obszar (ten mały) należy do obszaru zewnętrznego. Kombinujcie...
Potem policzyć pole nie rozciągnietego, wg tego wyszło z analizy rozciągniętego... :) I'm almost sure, it will work.
Im dłużej nad tym myślę, tym więcej przychodzi mi pomysłów...
powiększając dwukrotnie i uzupełniając ścieżkę znowu może sie pojawić problem, że te uzupełnione będą przy sobie równoległe... poza tym mnożnik wtedy zacznie skakać po potęgach 2, a to tylko strata czasu i pamięci. Więc trzeba jakoś sie zabezpieczyć... Nie warto znów tego dwukrotnie powiekszać... Chyba lepiej jest wrócic i zwiększyc mnożnik do 3 i sprawdzić, ewentuanie potem do czterech- liniowo, ale cały czas startować (powiększać) oryginalny stan.
Nie wiem, jeśli... Ja tylko gdybam.
Nie, wiecie 2x starczy, bo żółw się tu porusza tylko w kierunkach prostopadłych.
Do postu poniżej:
Pomyśle w międzyczasie, moze Ci cos podrzuce pascal, czy c++ , czy obojetne? Właściwie dla ułatwienia... Trzeba zapamietywać tylko te punkty, w których żółwik skręcał, bo reszta to przecież proste... Może sam sobie dasz radę. Nie, nie chodz mi o żadne odejmowenie.... Rzutujesz oryginalny punkt, na rozciągnięta powierzchnię i tylko sprawdzasz, czy należy do wnętrza, czy nie. Ale liczysz cały czas oryginał. Wiesz co zara biorę się do roboty, bo na przykładzie będzie najłatwiej...
Robi... Powieksza... Ale dalej nie robiłem nie mam czasu... W każdym razie punkt (x,y) z pierwotnej tablicy nalezy do wnętrza, gdy punkt z powiekszonej (2x,2y) nalezy do wnetrza, dalej powinienes sobie poradzic... Aha to jest pod dosa
{$A-,B-,D+,E-,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S+,T-,V+,X+,Y+}
{$M 16384,0,0}
{trouble.pas - answer for Trouble post}
type bytearr=array[0..65534]of byte;
pbytearr=^bytearr;
pointarr=array[0..32766,0..1]of byte;
ppointarr=^pointarr;
znak=record ch:char;at:byte end;
ekran=array[1..25,1..80]of znak;
const
arrx=10; {algorytm jest tak napisany, ze bedzie dzialal niezaleznie od tych cyferek}
arry=8; {przyklad, wiec wiecej nie potrzeba}
x=0;
y=1;
pointcount=16; {tyle zakretow}
z:array[0..pointcount-1,0..1]of byte= {zakrety}
((0,0), {zaczyna w prawo}
(9,0), {skeca w dol (+pi/2)-clockwise}
(9,2), {sreca w lewo (+pi/2)}
(5,2), {w dol (-pi/2)-anticlockwise}
(5,6), {w prawo (-pi/2)}
(7,6), {do gory (-pi/2)}
(7,3), {teraz w prawo (+pi/2)}
(9,3), {a teraz w dol (+pi/2)}
(9,7), {(dolny prawy rog)w lewo (+pi/2)}
(0,7), {(dolny lewy rog) do gory (+pi/2)}
(0,5), {w prawo (+pi/2)}
(3,5), {do gory (-pi/2)}
(3,2), {w lewo (-pi/2)}
(1,2), {w dol (-pi/2)}
(1,4), {w lewo (+pi/2)}
(0,4) {do gory + (+pi/2)}
{(0,0)jak wstawisz jeszcze raz to nie trzeba bedzie uzywac modulo)- your choice}
{---------}
{wszystko ok biorac pod uwage, ze (0,0) to (+pi/2) - obwod zamkniety}
);
var e:ekran absolute $b800:$0000; {zakadam, ze masz chociaz cga ;) }
const a:array[0..arry-1,0..arrx-1]of byte {oryginal}
=
((1,1,1,1,1,1,1,1,1,1),
(1,0,0,0,0,0,0,0,0,1),
(1,1,1,1,0,1,1,1,1,1),
(1,1,0,1,0,1,0,1,1,1), {<- tu sa 2 kyrtyczne momenty}
(1,1,0,1,0,1,0,1,0,1),
(1,1,1,1,0,1,0,1,0,1),
(1,0,0,0,0,1,1,1,0,1), {tu 1 zeby bylo smieszniej}
(1,1,1,1,1,1,1,1,1,1));
var b:array[0..arry-1,0..arrx-1]of byte; {kopia,ale wynik z przeliczen 1*oryginal}
c:array[0..arry*2-1,0..arrx*2-1]of byte; {kopia 2*oryginal - wynik z przeliczen}
procedure setxy(x,y:byte);
assembler;
asm
mov ah,02h
xor bh,bh
mov dl,[x]
dec dl {0-1=255 - underflow, but works, 255,255-> cursor out of screen}
mov dh,[y]
dec dh;
int 10h
end;
procedure cls(at:byte;ch:char);
var j,i:byte;
begin
for j:=1 to 25 do
for i:=1 to 80 do
begin
e[j,i].ch:=ch;
e[j,i].at:=at
end
end;
procedure print(x,y,at:byte;s:string);
var i:byte;
begin
asm dec [x] end;
for i:=1 to byte(s[0])do
begin
e[y,x+i].ch:=s[i];
e[y,x+i].at:=at
end
end;
procedure putchar(x,y,at:byte;ch:char);
begin
e[y,x].ch:=ch;
e[y,x].at:=at
end;
procedure drawtab(sx,sy:byte;p:pbytearr;multiply:byte);
var i,j:byte;
tx,ty:byte;
begin
tx:=arrx*multiply;
ty:=arry*multiply;
for j:=0 to ty-1 do
for i:=0 to tx-1 do
putchar(sx+i,sy+j,7,char(249-30*p^[(tx*j)+i]))
end;
function min(a,b:integer):integer;
assembler;
asm
mov bx,[b]
mov ax,[a]
cmp bx,ax
jge @1
mov ax,bx
@1:
end;
function max(a,b:integer):integer; {widzisz roznice?}
assembler;
asm
mov bx,[b]
mov ax,[a]
cmp ax,bx { <- tu ;-) }
jge @1
mov ax,bx
@1:
end;
{Dryo, gdyby nie Ty... mam burdel i nie wiem, gdzie szukac tej ksiazki - asm}
procedure createtab(t:pbytearr;p:ppointarr;points,multiply:byte); {tab lenght & width n dowolne}
var i:byte;
d:integer; {multiplikator dla posuwu wzdluz osi y - ble, brzmi okropnie}
k:integer; {koniec petli}
j:integer; {poczatek petli}
begin
for i:=1 to points do
begin
{nie, to wcale nie bylo trudne, nie, nad tym kawalkiem tylko pol dnia !! he , he}
if p^[i mod points,x]-p^[i-1,x]<>0
then
begin
d:=p^[i-1,y]*arrx*multiply; {ta zmienna jest wolna, wiec uzyje na pkt startowy}
j:=(min(p^[i mod points,x],p^[i-1,x])+d)*multiply; {zeby indeks petli while rosl}
k:=(max(p^[i mod points,x],p^[i-1,x])+d)*multiply;
d:=1; {dla posuwu poziomego- tokarki/frezarki, bleee}
end
else
begin
d:=p^[i-1,x]; {bo sa w jednej linii- ten sam x, wiec obojetne}
j:=((min(p^[i mod points,y],p^[i-1,y])*arrx)*multiply+d)*multiply;
k:=((max(p^[i mod points,y],p^[i-1,y])*arrx)*multiply+d)*multiply;
d:=arrx*multiply {dla posuwu pionowego}
end;
while j<=k do {rysowanie sciezki to juz banal :}
begin
t^[j]:=1;
inc(j,d)
end
end
end;
function isinside(sm,lg:pbytearray;px,py:byte):boolean; {sm- small, lg- large (default x2)}
begin
end;
function area:integer;
begin
end;
begin
{debug code
writeln(min(10,12));
writeln(min(12,10));
writeln(max(10,12));
writeln(max(12,10));
writeln(min(-10,12));
writeln(min(12,-10));
writeln(max(10,-12));
writeln(max(-12,10));
writeln(min(-10,-12));
writeln(min(-12,-10));
writeln(max(-10,-12));
writeln(max(-12,-10));}
asm
mov ax,03h
int 10h
end;
setxy(0,0); {precz! przecz z ekranu!}
fillchar(b,sizeof(b),0);
fillchar(c,sizeof(c),0);
createtab(@b,@z,pointcount,1); {x1 - zrob tablice z zapamietanych pointow}
createtab(@c,@z,pointcount,2); {x2 - z zapamietanych pointow}
print(1,1,$0e,'as You see : No trouble ;)');
drawtab(2,3,@a,1);
drawtab(2,13,@b,1);
drawtab(arrx+6,4,@c,2);
print(1,24,$0a,'niestety musisz miec pointy, zeby to dzialalo');
print(1,25,$0f,'[esc] - break');
asm
@1:
xor ah,ah
int 16h
xor ax,011bh {only esc}
jnz @1
end
end.
Oddam Ci prawa autorskie za pivo.