Van nekem egy "dobozom", abban egy másik "doboz". A külső dobozt elmozgathatom és átméretezhetem és a belső doboz koordinátáit szeretném kiszámolni. Mutatom:
#include <stdint.h>
#include <math.h>
void calc_new_sub_area
(
int32_t container_ox, int32_t container_oy, uint32_t container_ow, uint32_t container_oh,
int32_t container_nx, int32_t container_ny, uint32_t container_nw, uint32_t container_nh,
int32_t sub_area_ox, int32_t sub_area_oy, uint32_t sub_area_ow, uint32_t sub_area_oh,
int32_t *sub_area_nx, int32_t *sub_area_ny, uint32_t *sub_area_nw, uint32_t *sub_area_nh
)
{
float hor_ratio = container_nw / container_ow;
float ver_ratio = container_nh / container_oh;
*sub_area_nw = (uint32_t)round((float)sub_area_ow * hor_ratio);
*sub_area_nh = (uint32_t)round((float)sub_area_oh * ver_ratio);
}
Keresgettem és olyat találtam, hogy
int32_t container_owp2 = (int32_t)(container_ow >> 1);
*sub_area_nx = container_owp2 + (int32_t)round(hor_ratio * (float)(sub_area_ox - container_owp2));
int32_t container_ohp2 = (int32_t)(container_oh >> 1);
*sub_area_ny = container_ohp2 + (int32_t)round(ver_ratio * (float)(sub_area_oy - container_ohp2));
de ez csak akkor jó, ha a doboz nem mozdult el, azaz a közepe ugyanott maradt. Valakinek van ötlete?
- 1205 megtekintés
Hozzászólások
Azt akarod, hogy a belső doboz arányosan kövesse a külső változásait?
Adott x koordináta az eredeti szülő doboz bal és jobb széle között milyen arányban helyezkedik el: x_ratio = (x_old-container_ox)/container_ow (pl. 0 bal széle, 0.5 a közepe, 1 a jobb széle)
Ugyanilyen arányban az új x koordináta az új szülő dobozban: x_new = container_nx+container_nw*x_ratio
- A hozzászóláshoz be kell jelentkezni
Igen, erre gondoltam, köszönöm!
float x_ratio = (float)(sub_area_ox - container_ox) / (float)container_ow;
float y_ratio = (float)(sub_area_oy - container_oy) / (float)container_oh;
*sub_area_nx = container_nx + (int32_t)round((float)container_nw * x_ratio);
*sub_area_ny = container_ny + (int32_t)round((float)container_nh * y_ratio);
Hogy tudom a topiknak beállítani, hogy megoldva?
- A hozzászóláshoz be kell jelentkezni
Klasszikus legyilkolás: eltolod nullába (offset levon), nyuzsorítod, visszatolod. Vagy nem értem a problémát.
De emlékeim szerint a kétdimemziós eltolás-nyuzsorítás-forgatás leírható egy 3D mátrixszal való szorzással, ami célhrdverrel - ha sok ilyet csinálsz - gyorsabb lehet. (Ez már a szándékos elbonyolítása a dolgoknak ;-))
- A hozzászóláshoz be kell jelentkezni
Igen, de ez volt a kérdés, hogy hova tolom vissza, mert nem ugyanoda kellett. De fejesjoco kolléga már leszállította a megoldást.
- A hozzászóláshoz be kell jelentkezni