Zmiana rozmiaru zaznaczenia

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;
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)?

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

0

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

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.

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ł!

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;
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!

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 ;)

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.

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