
BG Development · За реклама · За контакти |
![]() ![]() ![]() ![]() ![]() |
Здравей! ( Включване | Регистриране ) |
![]() ![]() ![]() |
PxL |
Публикувано на: 21-11-2019, 00:01
|
![]() ![]() Име: Димитър Т. Димитров Група: VIP Ранг: Почетен член Мнения: 3159 Регистриран на: 26.04.05 ![]() |
Значи имам задачка да наредя растеризиран текст по крива. Т.е. буквално някакви правоъгълници трбва да може да се извиват по тая крива. В момента правя следното: Смятам си съответната крива със отделните и сегменти, също и разстоянията м-у "кутийките" за растера са си сметнати. Съответно вземам най-близката точка от кривата, преди точката, която покрива разстоянието между две букви и налагам там кутийката с оставащото отстояние и завъртам буквата, по посока на сегмента между текущата и следващата точка, това си работи добре.
Гледам обаче, че в популярни векторни софтуери по някакъв друг начин го смятат, например на тази картинка, моят алгоритъм няма да може да го направи, в сучая буква е почти съвпаднала с точка от кривата с малко отстояние, но не се премества с отместване към следващат или текущият сегмент, а се ротира по някакъв ъгъл, докато този ъгъл не стане прекалено голям. В моят случай това "а" ще е обърнато перпендикулярно от 2->3 та точка, или 3->4-та в зависимост от разстоянието. Не съм гледал готови кодове още, но си го представям, като да трябва да сложа някакво контролно отстояние, и ако разликата ми е по-малка от него, да държа позиция и само да ротирам на база точката, но почти съм убеден, че има по-лесен начин. Някакви идеи? Това мнение е било редактирано от DarkOne на 22-11-2019, 12:26 Прикачена картинка (Кликнете на картинката, за да я увеличите!) ![]() -------------------- void putchar(char c);int main(){int x,c=1,i;for(i=0;(x="PxLY2H4:2E;7231?=68255A5S5P9N:N9O84111H861I85111G9N:O811O812M<G33911EAEDBECE22169D1=2k"[i+++3]);)while(x-->'0')putchar((!(++c%'('))?0x0a:33^(i&1));}
|
Дон Реба |
Публикувано на: 21-11-2019, 07:49
|
Име: Група: Потребител Ранг: Почетен член Мнения: 8546 Регистриран на: 11.11.06 ![]() |
ами предлагам ти следния метод - смяташ ориентацията на буквата като претеглема сума на всички сегменти които покрива. позицията смяташ "до допир" . така както си го представям, бутайки буквата напред, в момента в който се покаже зад чупката (примерно 10%), трябва ориентацията и да стане смес 0.9 от сегмент н и 0.1 от сегмент н+1. позицията - до допир на основата в чупката (за изпъкнала чупка). така бутайки я напреде тя ще се завърти около чупката, но пак ще се движи, просто точката на допир ще я дели в пропорцията в което сме смесили нормалите
|
PxL |
Публикувано на: 21-11-2019, 09:21
|
||
![]() ![]() Име: Димитър Т. Димитров Група: VIP Ранг: Почетен член Мнения: 3159 Регистриран на: 26.04.05 ![]() |
Стана така, мерси. Вземам средното от двете нормали. Снощи нещо бях забил ![]() -------------------- void putchar(char c);int main(){int x,c=1,i;for(i=0;(x="PxLY2H4:2E;7231?=68255A5S5P9N:N9O84111H861I85111G9N:O811O812M<G33911EAEDBECE22169D1=2k"[i+++3]);)while(x-->'0')putchar((!(++c%'('))?0x0a:33^(i&1));}
|
||
DarkOne |
Публикувано на: 21-11-2019, 10:55
|
![]() ![]() Име: Александър Петков Група: Администратор Ранг: Почетен член Мнения: 3451 Регистриран на: 30.01.04 ![]() |
Аз бих го интерпретирал като претеглена сума от посочните вектори на отсечките - не че има особено значение, но нали искаш да формираш една виртуална права, която плавно преминава от съвпадаща с първата отсечка до съвпадаща с втората отсечка - няма нужда да правиш перпендикулярни вектори два пъти
![]() ![]() -------------------- The man who learns only what others know
is as ignorant as if he learns nothing. The treasures of knowledge are the most rare, and guarded most harshly. -- Chronicle of the First Age |
PxL |
Публикувано на: 21-11-2019, 11:59
|
||
![]() ![]() Име: Димитър Т. Димитров Група: VIP Ранг: Почетен член Мнения: 3159 Регистриран на: 26.04.05 ![]() |
Съгласен съм, аз тях и без това си ги имам, за да преместя с разликата от разстоянието. -------------------- void putchar(char c);int main(){int x,c=1,i;for(i=0;(x="PxLY2H4:2E;7231?=68255A5S5P9N:N9O84111H861I85111G9N:O811O812M<G33911EAEDBECE22169D1=2k"[i+++3]);)while(x-->'0')putchar((!(++c%'('))?0x0a:33^(i&1));}
|
||
![]() |
![]() ![]() ![]() |