Niezalogowany (Zaloguj się)
WItaj Gościu! Możesz się teraz zalogować lub poprosić o członkowstwo na Forum Turbo Pascal Web Pag
    • CommentAuthorparysm
    • CommentTime10 May 2008
     
    witam wszystkich! Mam pewien problem związany z napisaniem programu. chodzi mi o program który będzie przekształcać trójkąt w koło i odwrotnie a fazami pośrednimi ma stanowić trójkąt z zaokrąglonymi rogami. Nie wiem jak wogóle sie za to zabrać a zależy mi na czasie ponieważ mam do napisania jeszcze dwa dość proste programy.
    • CommentAuthorsteficzek
    • CommentTime11 May 2008 zmieniony
     

    Poczytaj sobie o Krzywych Béziera
    Wspomniany przez Ciebie trójkąt można zbudować z trzech linii przedstawionych na poniższym rysunku

    Zmieniając odpowiednio położenie punktów kontrolnych, można przekształcić proste boki trójkąta w krzywiznę okręgu.

    Algorytmów i opracowań matematycznych do wyświetlania krzywych Béziera znajdziesz bez liku w Google.

    Tutaj mozesz organoleptycznie spróbować przekształcić linię prostą w łuk.
    http://www.sunsite.ubc.ca/LivingMathematics/V001N01/UBCExamples/Bezier/bezier.html

    Pozdrawiam
    Stefan Pruszkiewicz
    • CommentAuthorsteficzek
    • CommentTime11 May 2008 zmieniony
     

    Na stronach wikipedii znalazłem niezbędne informacje i postanowiłem zarwać nockę, żeby coś sklecić w temacie Krzywych Béziera.

    Nie wiem czy tym razem nie przegiąłem i czy autor tego wątku cokolwiek z niego zrozumie, gdyby nawet nie - to pocieszam się faktem iż
    jest dużo ambitnych osób szukających ciekawych kodów na różnych forach tematycznych.
    Żeby cokolwiek skumać polecam poczytać najpierw o Wielomianowych krzywych Béziera trzeciego stopnia
    tutaj link http://pl.wikipedia.org/wiki/Krzywa_B%C3%A9ziera

    Poniższy program poprostu rysuje krzywą Béziera na podstawie podanych punktów A,B,C,D. Uses Graph; Type TPunkt = record x,y : Integer; end; procedure Bezier(A,B,C,D : TPunkt;Dodatki : Boolean); var Odcinek,t,x,y : Real; begin t:=0; Odcinek:=1/32; MoveTo(A.x,A.y); while t<=1 do begin x:=A.x*(1-t)*(1-t)*(1-t) + 3*B.x*t*Sqr(1-t) + 3*C.x*Sqr(t)*(1-t) + D.x*t*t*t; y:=A.y*(1-t)*(1-t)*(1-t) + 3*B.y*t*Sqr(1-t) + 3*C.y*Sqr(t)*(1-t) + D.y*t*t*t; LineTo(Round(x),Round(y)); t:=t+Odcinek; if Dodatki then Bar(Round(x)-1,Round(y)-1,Round(x)+1,Round(y)+1) end; if Dodatki then begin LineTo(C.x,C.y); LineTo(B.x,B.y); LineTo(A.x,A.y); Bar(B.x-1,B.y-1,B.x+1,B.y+1); Bar(C.x-1,C.y-1,C.x+1,C.y+1) end end; Const A : TPunkt = (x: 10;y:240); B : TPunkt = (x:100;y: 50); C : TPunkt = (x:350;y:100); D : TPunkt = (x:600;y:400); Var Sterownik,Tryb : Integer; Begin InitGraph(Sterownik,Tryb,''); Bezier(A,B,C,D,True); Readln; CloseGraph End.
    Pozdrawiam
    Stefan Pruszkiewicz
    • CommentAuthorparysm
    • CommentTime12 May 2008
     
    dziękuje Ci bardzo za fatygę i poświęcony czas. Pozdrawiam
    • CommentAuthorsteficzek
    • CommentTime12 May 2008 zmieniony
     

    A nie mówiłem... buahahahaaa - pstryk i zwątpił!- nie ma to jak fascynująca wymiana zdań,
    a zostało tak niewiele - sklecić tylko do kupy 3 krzywe jak na rysunku i przejść z postaci czerwonej na postać podobną do zielonej,
    Pewnie myślał chłopina o wbudowanej procedurze Triangle2Circle; : )
    a tu niestety prawie zahaczyłby o morphing.

    Pozdrawiam
    Stefan Pruszkiewicz

    P.S. "parysm" Sorki za sarkazm.
    (...) też kiedyś byłem murzynem i grałem w koszykówkę (...)
    • CommentAuthorparysm
    • CommentTime24 May 2008
     
    ludzie, pomocy ten program jest mi bardzo potrzebny, steficzek ja jestem laikiem wiec nie potrafię tego zrobić żeby mi działało proszę Cię mógłbyś chociaż wstawić jakiś podobny program o przekształceniu (najlepiej trójkąta w kółko) może masz jakiś tam, jest mi to potrzebne na zaliczenie, błagam pomocy !!!!!
    • CommentAuthorsteficzek
    • CommentTime24 May 2008 zmieniony
     

    Ja tu czegoś nie kumam.
    Dostałeś odemnie gotową procedurę rysującą krzywą beziera która może przyjąć kształt prostej lub łuku.
    Nie zagłębiając się w jej działanie możesz ustawić trzy krzywe beziera tworząc trójkąt,
    pozostaje tylko tak ustawić wierzchołki B i C każdej krzywej żeby z trójkąta otrzymać okrąg.

    Z tego co piszesz wynika że jesteś na poziomie przekształcania prostokąta w kwadrat,
    a dostajesz zadanie które nie wiele osób w polsce jest w stanie na miejscu rozwiązać - o co tu chodzi?
    Zadania takie nie dostaje się na pierwszych zajęciach z Programowania.
    No chyba że jest to Twoje jakieś "widzi mi się"... jeśli tak, wybacz - ale marnujesz mój cenny czas.


    a narazie masz takie coś:
    Begin NarysujTrojkąt; WyczyscEkran; NarysujOkrag; end.

    I powiedz panu psorowi że jest to przekształcenie trójkąta w okrąg,
    bo i faktycznie jest, tyle tylko że nie płynne, a w jednym kroku,
    na ocenę mierną napewno wystarczy, jesli będziesz miał gadane.
    A jak się z tym nie zgodzi to przyślij go do mnie, ja mu to udowodnię!
    • CommentAuthorparysm
    • CommentTime5 Jun 2008
     
    prosze Cie wykonałbyś mi to musze to mu pzedstawić to do soboty a niedaje rady tego rozgryźć, jestem kompletnym laikiem, niepastw sie nademną ale jeśli znajdziesz chwilke czasu prosze Cie bardzo podesłałbyś mi to na maila (parysm@gmail.com) Wiem że jestem leniem i że nawet niespróbuje tego zrobić ale ja tego nierozumiem, Te zadanie przerasta mnie ,błagam odpisz!
    • CommentAuthorsteficzek
    • CommentTime5 Jun 2008
     

    Pogódź się z porażką.

    Jeśli tego nie pojąłeś, nie zrozumiesz już nic ponadto... bynajmniej na razie.
    Zadanie poprostu przerasta Twój zasób wiedzy i doświadczeń.
    Więc nie widzę sensu go bardziej rozwijać skoro i tak go na tym poziomie nie trawisz.
    • CommentAuthorparysm
    • CommentTime6 Jun 2008
     
    ale ja tylko proszę aby ktośto zrobił za mnie ponieważ tylko to mi juz zostało...a wideze że tylko Ty tu zaglądasz i to czytasz,a ztego co zdążyłem zaobserwować to Ty zdaje się rozumiesz co i jak wieć zrobienie tego progamu to dla ciebie pestka , prosze cię tylko o poświęcenie 5minut czasu ,tyle.....
    • CommentAuthorsteficzek
    • CommentTime6 Jun 2008 zmieniony
     

    Utwórz 3 linie Beziera z punktów A,B,C,D
    przykładowo:
    Bezier(A1,B1,C1,D1,False);
    Bezier(A2,B2,C2,D2,False);
    Bezier(A3,B3,C3,D3,False);

    i zmieniaj tak parametry:
    B1,C1,
    B2,C2,
    B3,C3
    żeby otrzymać raz linię(bok trójkąta), a raz łuk.
    Trzy takie łuki dadzą Ci okrąg.

    MAM PYTANIE do innych forumowiczów! Czy jest to dla was zrozumiałe?
    Czy może ja coś źle po raz trzeci tłumaczę. Bo zaczynam mieć wątpliwości


    P.S. Wracając do 5 minut, jesteś w ogromnym błedzie myśląc że wymyślenie i stworzenie procedury rysującej krzywą Beziera zajeło mi pięć minut.
    Chyba naprawdę nie pojmujesz ile już czasu na Ciebie zmarnowałem.
    • CommentAuthorrachwal
    • CommentTime6 Jun 2008
     
    Mysle, ze kolega nawet nie zajrzal do wiki po definicje krzywej beziera ...
    • CommentAuthorparysm
    • CommentTime10 Jun 2008 zmieniony
     
    witam po raz kolejny. Postanowiłem zrobić przekształcenie na podstawie tego co podawał Steficzek kilka postów wyżej. Zainicjowałem grafike , narysowałem kółko, napisałem składnie ClrScr, następnie narysowałem prostokąt , ponieważ przeszukując google nie mogłem znaleźć składni która umożliwiłaby mi narysowanie trójkąta. Program jako tako działa ale niewyswitla mi tego czego chciałem. Mianowicie chodzi mi o to że kółko nie pzechodzi w prostokąt. Próbowałem na różzne sposoby ale dalej nic mi niewychodzi :( Kod podałem poniżej jesli ktoś zauważy co zrobiłem źle i dlaczego kólko niezmienia sie w prostokąt . A jeśli chciałbym zrobić tak aby kółko zmienialo sie w trójkąt i odwrotnie to muszę zastosować pętle. Czy dobrze myśle? Uses GRAPH,CRT; Var ster,tryb:integer; Begin ster:=VGA; tryb:=VGAHi; InitGraph(ster, tryb, 'C:\TP\BGI' ); Circle(320,240,40); ClrScr; Rectangle(320,240,40,40); Repeat Until Keypressed; CloseGraph; End. EDIT: już wiem w czym tkwi problem: CLRSCR jest to procedura do czyszczenia ekranu w trybie tekstowym, do trybu graficznego używamy CLearDevice . Zastosowałem również składnie DELAY co umożliwi zmiane figury. Moje starania do uzyskania trójkąta na razie nie przyniosi rezultatu. Jeszcze popracuje nad tym żeby te figury zmieniały sie cały czas , kóko w prostokąt, prostokąt w kółko itd itd. Czy któś mógłby mnie naprowadzić na własciwy trop....
    • CommentAuthorsteficzek
    • CommentTime10 Jun 2008 zmieniony
     
    Uses Crt,Graph; Const Trojkat : array [0..3] of PointType = ((x:320;y:200),(x:280;y:260), (x:360;y:260),(x:320;y:200)); Var Sterownik,Tryb : Integer; Begin InitGraph(Sterownik,Tryb,'c:\bp\bgi'); repeat SetColor(White); Circle(320,240,30); Delay(1000); SetColor(Black); Circle(320,240,30); SetColor(White); DrawPoly(4,Trojkat); Delay(1000); SetColor(Black); DrawPoly(4,Trojkat) until KeyPressed; CloseGraph End. !!! Uwaga efekt zaokrąglania rogów jest tylko i wyłącznie złudzeniem optycznym !!! : )
    • CommentAuthorparysm
    • CommentTime10 Jun 2008
     
    Dziękuje że miałeś jeszcze cierpliwość tu zajrzeć i mi pomóc. Tym razem i ja wziełem się do roboty, mogłem wczesniej ale niestety chciałem pójśc na łatwizne. Dziękuje że odpowiedziałeś na moje pytania :) Pozdrawiam !