Zmiana rozmiaru zaznaczenia

Odpowiedz Nowy wątek
2011-09-02 10:57
ATMEL
0

Witam, mój problem polega na braku pomysłu przy zrealizowaniu zmiany rozmiaru zaznaczenia. Coś na wzór zwężenia, czy poszerzenia zaznaczenia w Photoshop'ie o zadaną ilość pikseli.
Nie mam pojęcia jak miałoby to wyglądać z matematycznego czy algorytmicznego punktu widzenia.
Od razu zaznaczam, iż nie chodzi tutaj o skalowanie, bo to całkiem co innego i nie rozwiązuje to problemu.
Przykładowo mając figurę klepsydry opisaną sześcioma punktami o wymiarach powiedzmy 100px x 200px i zawężając takie zaznaczenie o np. 50px; powstaną dwa małe trójkąty (jeden na górze drugi na dole). Potrzebuję współrzędne punktów tych nowych figur.
Potrzebuję funkcję najlepiej w Delphi, której argumentami będą tablica punktów (określa dowolną figurę, wielokąt) oraz ilość pikseli do zawężenia, a zwracającą tablicę tablic punktów nowo powstałych figur.
Deklaracja:

type
   TPoints = array of array of TPoint;
 
function ChengeSelect(Figure : array of TPoint; Distance : Byte) : TPoints;

Pozostało 580 znaków

2011-09-02 11:07
0

figurę klepsydry opisaną sześcioma punktami o wymiarach powiedzmy 100px x 200px i zawężając takie zaznaczenie o np. 50px;
zawężając od której strony?

i o co ci właściwie chodzi? przycięcie figury o jakiś margines (zabranie n pikseli z każdej lub którejś strony)?

chodzi o jej 'ściśnięcie' :p - masz np. prostokąt 100x200 i ściskasz go do 100x150 - Misiekd 2011-09-02 11:13

Pozostało 580 znaków

2011-09-02 11:12
0

x_nowy = x_stary - (x_stary / (x_max - x_min)) * x_delta
gdzie
x_stary to aktualne położenie punktu
x_max to szerokość figury
x_min to 0
x_delta to o ile ma nastąpić zmiana szerokości

dla y analogicznie


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
edytowany 1x, ostatnio: Misiekd, 2011-09-02 11:13

Pozostało 580 znaków

2011-09-02 11:13
ATMEL
0

Dokładnie, można powiedzieć, że przycięcie o margines.
Tylko może to być dowolna figura - wielokąt.

Pozostało 580 znaków

2011-09-02 11:22
ATMEL
0

Azarien:
Ściśnięcie to w pewien sposób zmiana rozmiaru, a więc skalowanie, a to byłoby poprawne dla podstawowych figur jak kwadrat czy trójkąt, ale do złożonych wielokątów to nie zda egzaminu.
Misiekd:
Niestety, ale sposób skalowania nie rozwiązuje problemu.

Najlepiej to widać w Photoshopie.

teraz to jużeś tak namieszał, że nie wiadomo o co ci chodzi. - Azarien 2011-09-02 11:43

Pozostało 580 znaków

2011-09-02 11:37
0

no to nie mam pojęcia o co Ci chodzi - wiadomo, że piksel jest piksel i nie da się przesunąć punktu o np. 0,5 piksela bo się po prostu nie da. A mój sposób działa bardzo dobrze o ile oczywiście masz świadomość pewnych graniczeń samego sprzętu. Inna sprawa, że to o co pytałeś to jest grafika WEKTOROWA a PhotoShop nigdy obok takowej nawet nie stał!


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-09-02 11:44
ATMEL
0

user image

Ta czarna ("zewnętrzna") figura to kształt wejściowy. Te trzy niebieskie ma zwrócić funkcja przekazując do niej współrzędne tej największej figury (czarnej) i odległość 20px powinna zwrócić trzy-elementową tablicę zawierającą tablice punktów tych trzech figur.
Po Twoim algorytmie Misiekd czarna figura wyglądała by identycznie jak teraz tylko byłaby mniejsza.
Oczywiście cały czas mam na myśli grafikę wektorową (zresztą współrzędne punktów o tym świadczą), jest ona generowana automatycznie, ale to nie ważne.
Jasna sprawa, że nie ma 0,5px dlatego zadowolę się przybliżeniem do 1px :) (piszę px bo łatwiej na tych jednostkach operować - domyślnie brak jednostek to są jedynie wartości). Figury są dość duże, rzędu tysięcy pikseli. Źle zapisałem typ punktów powinno być:

TPoints = array of array of record 
   X, Y : Extended;
end;

Pozostało 580 znaków

2011-09-02 11:51
0

jeśli przekazujesz JEDNĄ tablicę (czyli JEDNĄ figurę) to na wyjściu dostajesz JEDNĄ tablicę (czyli JEDNĄ) figurę ale mniejszą/większą! Jak chcesz mieć TRZY na wyjściu to przekazujesz TRZY na wejściu. To takie trudne?? A jak ci się coś zmieni i zamiast trzech będziesz chciał mieć dwie albo pięć to algorytm ma się domyślać???? Zrozum FIGURA JEST FIGURA i program może ci ją zmniejszyć/zwiększyć ale NIE ROZBIĆ NA INNE!


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-09-02 12:04
ATMEL
0

Uwierz, że się da - twórcy Photoshopa i innych programów jakoś to rozwiązali, z resztą kolega mi pisał podobny algorytm, ale było w tym tyle matematyki, że się to strasznie pogmatwało i nie działało dla wszystkich figur. Nie wiem jak mam to jeszcze tłumaczyć przekazuję jedną figurę (najmniej złożoną, jednak mniej złożona niż podana wyżej jest nie możliwa). Algorytm byłby w stanie się domyślić, jeżeli zawężenia na siebie zachodzą tzn. figury się całkiem od siebie odcinają i powstają nowe.
Na początku przytoczony przeze mnie przykład klepsydry - jest ona zwężona po środku. Powiedzmy że podstawa i góra mają 100px, a jej zwężenie 50px (tu gdzie przesypuje się piasek).
Jeżeli zwężę tą klepsydrę o 25px (odległość od każdej ze ścian) to nie ma siły powstaną dwa trójkąty.
To tak jakby wyciął z kartki papieru taką klepsydrę i na około od każdej z jej krawędzi poodcinał po powiedzmy 1cm (te 25px) to kartka podzieli się na dwa trójkąty,a te ścinki do kosza ;)

Pozostało 580 znaków

2011-09-02 12:09
ATMEL
0

Sam to też próbowałem robić wyznaczając funkcję liniowe tych wszystkich boków, przesuwając te funkcję o zadaną odległość i badając punkty ich przecięcia oraz ewentualne "zamknięcia" się funkcji wyznaczały kolejną figurę, ale to też nie działało dla każdego przypadku, głównie mam na myśli kąty rozwarte figury.

Pozostało 580 znaków

2011-09-02 12:59
0

napiszę to jeszcze raz JEŚLI NA WEJŚCIU JEST JEDNA FIGURA TO NA WYJŚCIU TEŻ JEST JEDNA!
Napisz, gdzie photoshop ma taką opcję, bo ja nie widziałem. Dalej Photoshop nie jest programem do grafiki wektorowej więc on robi to całkiem inaczej! Tam nie ma figur - nawet jak narysujesz linię to ona nie jest figurą tylko zbiorem pikseli!

test.png

Dla mnie jeśli oryginalną figurą jest pierwsza to po zmniejszeniu o 25% z każdej strony poprawnym wynikiem jest dwa a nie trzy ponieważ dostaję na wejściu tą figurę jako całość i tak ją też traktuje!

Taką figurę jak ta trzecia corel Ci zrobi jeśli ta pierwsza to będą DWIE figury i jak zaznaczysz je obie. Ale to muszą być dwa trójkąty narysowane oddzielnie.

I jeszcze jedno - jeśli mam taką figurę opisaną CZERWONYMI punktami
test1.png
to mam znaleźć punkt NIEBIESKI, rozbić ją na dwie figury i każdą potraktować osobno co da w efekcie takie coś
test1b.png
czy też potraktować ją jako całość i zwrócić takie coś
test1a.png
oczywiście nie ma tam zachowanych żadnych proporcji - ot mazanina w paincie


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
edytowany 4x, ostatnio: Misiekd, 2011-09-02 13:23

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0