Daite suvet

17 отговора 590 прегледа
#1

Daite suvet

Abe nqkoi znae li nachin za image rotation izvun DirectX i OpenGl.
Thank you!

Отговор
в отговор на Mihail12 #2

Re: Daite suvet

se6tam se samo za softwaren texture mapping. ne e mnogo trudno. ama trqbwa da potyrsi6 materiali po wyprosa

Отговор
в отговор на prostaka #3

Re: Daite suvet

За огледална конверсия можеш да пробваш да размениш стойностите на X и Y координатите на всички точки. В някои случай резултата изглежда като завъртане надясно на 90 градуса :-))) Това е трик, а не решение обаче !

don't waste my time - waste yours !
Отговор
в отговор на Mihail12 #4

Re: Daite suvet

t.e. iskash da go zavartish na niakakav agal izobrajenieto ?
emi che sto ne probvash standartno da smenish koordinatnata sistema

xNew = x * cosA - y * sinA + a
yNew = x * sinA + y * sinA + b

A ti e agala na zavartane , (a,b) vektora na translacia
na tia novi koordinati zapisvash Color[x,y]

ako za tova stava vapros de 8-)

Отговор
в отговор на xenomeno #5

Браво !

Ашколсун :-)))
Ти ми хареса. Това си е математическия начин - няма значение ОС или разни софтуерни слоеве :-)))

don't waste my time - waste yours !
Отговор
в отговор на xenomeno #6

Re: Daite suvet

za syvalenie ne e tolkowa lesno. ako sled towa se narisuwa towa ne6to 6te widi6 4e ima dosta 4erni petna - ponqkoga matematikata ne e towa koeto e :)

Отговор
в отговор на prostaka #7

Re: Daite suvet

Zatova obryshtash f-lata i gotovo. Izchislyavash spryamo target pixelite.

Отговор
в отговор на prostaka #8

Re: Daite suvet

Няма никакви черни петна.
Това е начина, но по добре да се се изрази (Xold, Yold) чрез (Xnew, Ynew). Ако новото положение е завъртване на ъгъл alpha (измерен от оста Ox обратно на часовниковата стрелка) имаме:

static double c;
static double s;

void Rotate(int Xnew, int Ynew, int *Xold, int *Yold)
{
double c = cos(alpha);
double s = sin(alpha);
*Xold = (int)(Xnew * c - Ynew *s);
*Yold = (int)(Xnew * s + Ynew *c);
}

//
След това си правим цикъл по новите координати и пренасяме точките от старите координати. Когато сме извън image_old, приемаме някакъв цвят, да речем черен:

// . . .
c = cos(alpha);
s = sin(alpha);
for(Ynew = 0; Ynew < MAXY; Ynew ++)
for(Xnew = 0; Xnew < XMAX; Xnew++)
{
Rotate(Xnew, Ynew, &Xold, &Yold);
if (точката <Xold, Yold> е извън image_old)
color = BLACK;
else
color = image_old[Xold][Yold];
image_new[Xnew][Ynew] = color;
}
// . . .

//
Какъв е проблема?

Отговор
в отговор на weyl #9

Re: Daite suvet

Проблема ми се струва е, че с чисто математическия метод, изображението може да стане доста ръбесто. То работи, ама трябва да му се приложи и някакъв AntiAliasing може би ...

Mixy
Отговор
в отговор на Mixy #10

Re: Daite suvet

hum, basi... mai sum zatapial dosta naposledak... kakuv drug metod moje da ima osven matemati4eski?

Отговор
в отговор на Mixy #12

Re: Daite suvet

Какво значи AntiAliasing?

По принцип ще има някакви микроскопични дефекти - сигурно имаш в предвид че от ротацията получаваме не-цели числа, които после закръгляваме до цели координати.
А какъв избор имаме?

Може винаги да се добави някой заглаждащ филтър ... но филтъра променя образа!

Един по-слаб заглаждащ филтър може да получим чрез конволюция с матрицата

| 1 1 1 |
| 1 9 1 | * (1/17)
| 1 1 1 |

Това значи вместо да вземаме

color = image_old[Xold][Yold];

да вземем в предвид и околните pixel-и

color =
(image_old[Xold-1][Yold-1] + image_old[Xold][Yold-1] + image_old[Xold+1][Yold] +
image_old[Xold-1][Yold] + 9*image_old[Xold][Yold] + image_old[Xold+1][Yold] +
image_old[Xold-1][Yold+1] + image_old[Xold][Yold+1] + image_old[Xold+1][Yold+1])
/ 17;

Може и по-сложна логика - да засилваме или отслабваме коефициентите в конволюционната матрица в зависимост от реалните (double) стойности на Xold и Yold.

Зависи как ти харесва.
При всички случаи ще има някакви микроскопични дефекти!
Според мен всичко това е излишно.

Отговор
в отговор на jamie #13

Re: Браво !

sha sa setish 8-)

Отговор
в отговор на Potencialen emigrant #14

Re: Daite suvet

imenno, texture-mappvash
kato gledam mu triabva samo 2D taka che shte mu otpadne problema s interpolacii prez neznam si kolko pixela na 1/Z i tem podobni

Отговор
в отговор на weyl #15

Re: Daite suvet

abe stavashe vapros samo za zavartane sega i filtri ako pocnesh da mu slagash otgore ste stane palna boza
zakacash za vseki ot varhovete koordinatite na teksturata ( u,v ) koito sa fiksirinai
posle puskash na novopolucenia zavartian obraz edin scanline za da go rasterizirash kato v kraistata na vseki scanline izcisliavash (uStart,vStart) i (uEnd,vEnd ) i dokato izcertavash scanline-a interpolirash mejdu tiah lineijno tai kato vsicko ti stava v 2D i na tekustite (x,y) koordinati slagash pixela ot originalnoto izobrajenie s koordinati na teksturata (u,v)
onezi (uStart,vStart) i (uEnd,vEnd) sasto mojesh da gi interpolirash poneje sa vinagi po granicnite linii na izobrajenieto

Отговор
в отговор на xenomeno #16

Re: Daite suvet

>abe stavashe vapros samo za zavartane sega i filtri ako pocnesh da mu slagash otgore ste stane palna boza
>zakacash za vseki ot varhovete koordinatite na teksturata ( u,v ) koito sa fiksirinai
>posle puskash na novopolucenia zavartian obraz edin scanline za da go rasterizirash kato v kraistata na vseki scanline
> ...

ОК, не са нужни филтри.

Така ясно говориш, . . . като на себе си :( Почти не те разбирам.

Може би искаш да кажеш, че ще местиш от горе на долу една завъртяна линия върху стария образ, ще я обхождаш с алгортъма на Bresenham (както работи LineDDA от Win) и ще копираш пикселите.
Ако е това, . . . напълно съм съгласен.

Отговор
в отговор на weyl #17

Re: Daite suvet

abe sega i az tebe ne te razbrah ama ... 8-)
otgore nadolu da samo che po novia obraz i niama da mi triabva Bresenham zastoto tia ste e horizontalna 8-)
a kato minavam po pikselite ot novia ste izcisliavam na bazata na tiah koi ot staria saotvetstvat

Отговор
в отговор на xenomeno #18

Re: Daite suvet

OK,
извинявам се, че и аз не бях точен.

Програмата дето показах по-горе работи точно така: обхожда новия образ отгоре - надолу и на всяка стъпка пресмята координатите в стария образ.

За съжаление тази трансформация трябва да се прави WIDTH * HEIGHT пъти за всяка точка (X, Y).

Помислих, че с Bresenham може да се избегнат част от сметките, но май не е много ясно дали може да стане.

Отговор