旋轉裁剪演算法

2021-08-07 15:10:33 字數 2821 閱讀 8593

首先看一下qq影像的旋轉裁剪功能中的對比

其中裁剪決定了旋轉後抽離其中的區域,並保持了原先的寬高比。

經過研究,轉化為計算中間等比例矩形的寬高,即(x1,y1)(x2,y2)的值

當然這個裁剪的點也可能因為旋轉角度以及原尺寸的關係取右上角的ac和bd直接與gh的兩個相交點。因此在求出這些點的時候比較一下ab與ef的相交點 與 bd與gh的相交點的縱座標哪個值更大則取相應的交點。

於是通過建立函式模型,需要注意的是y為向下為正方向,因此列方程的時候為當前的圖形關於x軸對稱的圖形

ef : y = k * x;

gh : y = r.h - k * x;

ab : y = -cota * x + h * cosa;

cd : y = -cota * (x - h * sina - w / cosa ) ;

ac : y = tana * (x - h * sina);

bd : y = tana * (x - h * sina + h / cos(90 - a)) = tana * (x - h * sina + h / sina);

r.h為旋轉後的圖形高度 w與h 分別為原圖的寬高值。a為旋轉的角度

int mod_angle = angle >= 270 ? (90 - angle % 90) : angle;

rgbquad color = ;

auto firotate = freeimage_rotate(dibs, angle, &color);

size szrotate = ;

size sz***** = ;

#define m_pi 3.14159265358979323846 // pi

float sin_of_angle = sin(mod_angle * m_pi / 180);

float cos_of_angle = cos(mod_angle * m_pi / 180);

float tan_of_angle = tan(mod_angle * m_pi / 180);

float cot_of_angle = 1 / tan_of_angle;

float k = 1.0 * szrotate.cy / szrotate.cx;

int h = sz*****.cy, w = sz*****.cx;

// ef : y = k * x;

// gh : y = r.h - k * x;

// ab : y = -cota * x + h * cosa;

// cd : y = -cota * (x - h * sina - w / cosa ) ;

// ac : y = tana * (x - h * sina);

// bd : y = tana * (x - h * sina + h / cos(90 - a)) = tana * (x - h * sina + h / sina);

// ef與ab相交於[(h * cosa / (k + cota)), k * 前者]

// ef與cd相交於[ (h * cosa + w / sina) / (k + cota), k * 前者 ]

// gh與ac相交於[ (r.h + h * sina * tana) / (tana + k), r.h - k * 前者] r.h = szrotate.cy

// gh與bd相交於[ (r.h + h * sina * tana - h / cosa) / (tana + k), h - k * 前者]

rect rccutter = ;

pointf ptef_ab = ;

ptef_ab.x = h * cos_of_angle / (k + cot_of_angle);

ptef_ab.y = ptef_ab.x * k;

pointf ptef_cd = ;

ptef_cd.x = (h *cos_of_angle + w / sin_of_angle) / (k + cot_of_angle);

ptef_cd.y = ptef_cd.x * k;

pointf ptgh_ac = ;

ptgh_ac.x = (szrotate.cy + h * sin_of_angle * tan_of_angle) / (tan_of_angle + k);

ptgh_ac.y = szrotate.cy - k * ptgh_ac.x;

pointf ptgh_bd = ;

ptgh_bd.x = (szrotate.cy + h * sin_of_angle * tan_of_angle - h / cos_of_angle) / (tan_of_angle + k);

ptgh_bd.y = szrotate.cy - k * ptgh_bd.x;

if (ptef_ab.y < ptgh_ac.y)

else

dibd = freeimage_copy(firotate, rccutter.left, rccutter.top, rccutter.right, rccutter.bottom);

freeimage_unload(firotate);

直線裁剪演算法

此演算法 就是cyrus beck裁剪演算法 1.判斷dx,dy是否為零作相應的簡單處理,並返回 2.下面通過例子說明第2步的原理,現在先給出原理 如果p1p2與裁剪區域有交點,那麼p1p2與裁剪區域存在交集,使得交集中的任一元素t同時滿足下列不等式 xmin x1 dx t xmax 1 ymin...

Liang Barsky直線段裁剪演算法

考慮凸多邊形區域r和直線段p1p2 p t p2 p1 t p1 設a是區域r的邊界上一點,n是區域邊界在a點的內法線向量 則對於線段p1p2上任一點p t n p t a 0 外側 n p t a 0 內側 n p t a 0 邊界或其延長線上 凸多邊形的性質 點p t 在凸多邊形內的充要條件是,...

實驗四 編碼裁剪演算法

一 實驗目的和要求 1.了解二維圖形裁剪的原理 點的裁剪 直線的裁剪 多邊形的裁剪 利用vc opengl實現直線的裁剪演算法。二 實驗內容及主要步驟 1 理解直線裁剪的原理 cohen surtherland演算法 梁友棟演算法 2 利用vc opengl實現直線的編碼裁剪演算法,在螢幕上用乙個封...