Átméretezett és átmozgatott "szülődobozban" a "gyerekdoboz" új koordinátáinak kiszámolása

Fórumok

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?

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

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?

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