500分-求解矩形旋转问题

CraxyMouse 2009-03-17 09:29:24
分不够可以在加
解决了我在开贴给分!!!!
源程序可在:
http://download.csdn.net/source/993353VS-2008

http://download.csdn.net/source/804208VS-2005

实现功能:矩形按矩形中心点旋转,
用鼠标拖动可以实现旋转
旋转后可以也要可以正常选择

也可以参考word 绘图中矩形旋转!!

旋转效果:



...全文
824 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
micheitdt 2012-01-10
  • 打赏
  • 举报
回复
提供一個方法:
在mousedown事件記錄目前角度。
在mousemove事件算移動多少的角度
移動多少的角度 = Math.Atan2(滑鼠移動座標的差(y), 滑鼠移動座標的差(x)) / Math.PI * 180.0;
看看這個有沒有幫忙
CraxyMouse 2009-03-19
  • 打赏
  • 举报
回复
继续求解!
cookielove4 2009-03-18
  • 打赏
  • 举报
回复
顶!!!!!
云想慕尘 2009-03-18
  • 打赏
  • 举报
回复
由矩形自身可以确定一个圆,圆心就是对角线的交点,拖动鼠标时让一个点移动,然后根据相对位置就可以得到其他3个点,从而确定一个矩形
linaren 2009-03-18
  • 打赏
  • 举报
回复
曾经用C++实现过类似的功能,C#里还没有具体实现过,不过思路可以参考如下:
1。定义矩形类,功能就是根据顶角坐标画出矩形以及选中状态下选中点
2。视图中多个矩形对象放置到连表中
3。鼠标按下事件里,如果位置处于链表对象中选中点范围内,记录当前选中对象
4。鼠标释放事件里,根据选中对象偏移,改变对象顶角坐标,重绘矩形

当然其中还要有其他很多处理,比如鼠标移动事件画轨迹等,
具体代码我想不是一下子能完成的。
hubofly 2009-03-18
  • 打赏
  • 举报
回复
顶一下,关注
yl0618 2009-03-18
  • 打赏
  • 举报
回复
还未曾见过~~~
改天关注下
smallfile 2009-03-18
  • 打赏
  • 举报
回复
我看过你的代码了,如果说想要绘制旋转,基本属于重新构思。
旋转图形根据地不是区域,而是坐标点。根据坐标点和角度,计算出绘制区域和图形。
浪子-无悔 2009-03-18
  • 打赏
  • 举报
回复
up....
CraxyMouse 2009-03-18
  • 打赏
  • 举报
回复
UPUPUPUPUPUPUP
hangang7403 2009-03-18
  • 打赏
  • 举报
回复
up
wonder888888 2009-03-18
  • 打赏
  • 举报
回复
HBITMAP GetRotatedBitmapNT( HBITMAP hBitmap, float radians, COLORREF clrBack )
{
// Create a memory DC compatible with the display
CDC sourceDC, destDC;
sourceDC.CreateCompatibleDC( NULL );
destDC.CreateCompatibleDC( NULL );

// Get logical coordinates
BITMAP bm;
::GetObject( hBitmap, sizeof( bm ), &bm );

float cosine = (float)cos(radians);
float sine = (float)sin(radians);

// Compute dimensions of the resulting bitmap
// First get the coordinates of the 3 corners other than origin
int x1 = (int)(bm.bmHeight * sine);
int y1 = (int)(bm.bmHeight * cosine);
int x2 = (int)(bm.bmWidth * cosine + bm.bmHeight * sine);
int y2 = (int)(bm.bmHeight * cosine - bm.bmWidth * sine);
int x3 = (int)(bm.bmWidth * cosine);
int y3 = (int)(-bm.bmWidth * sine);

int minx = min(0,min(x1, min(x2,x3)));
int miny = min(0,min(y1, min(y2,y3)));
int maxx = max(0,max(x1, max(x2,x3)));
int maxy = max(0,max(y1, max(y2,y3)));

int w = maxx - minx;
int h = maxy - miny;

// Create a bitmap to hold the result
HBITMAP hbmResult = ::CreateCompatibleBitmap(CClientDC(NULL), w, h);

HBITMAP hbmOldSource = (HBITMAP)::SelectObject( sourceDC.m_hDC, hBitmap );
HBITMAP hbmOldDest = (HBITMAP)::SelectObject( destDC.m_hDC, hbmResult );

// Draw the background color before we change mapping mode
HBRUSH hbrBack = CreateSolidBrush( clrBack );
HBRUSH hbrOld = (HBRUSH)::SelectObject( destDC.m_hDC, hbrBack );
destDC.PatBlt( 0, 0, w, h, PATCOPY );
::DeleteObject( ::SelectObject( destDC.m_hDC, hbrOld ) );

// We will use world transform to rotate the bitmap
SetGraphicsMode(destDC.m_hDC, GM_ADVANCED);
XFORM xform;
xform.eM11 = cosine;
xform.eM12 = -sine;
xform.eM21 = sine;
xform.eM22 = cosine;
xform.eDx = (float)-minx;
xform.eDy = (float)-miny;

SetWorldTransform( destDC.m_hDC, &xform );

// Now do the actual rotating - a pixel at a time
destDC.BitBlt(0,0,bm.bmWidth, bm.bmHeight, &sourceDC, 0, 0, SRCCOPY );

// Restore DCs
::SelectObject( sourceDC.m_hDC, hbmOldSource );
::SelectObject( destDC.m_hDC, hbmOldDest );

return hbmResult;
}
CraxyMouse 2009-03-18
  • 打赏
  • 举报
回复
旋转矩形???什么意思?
suners 2009-03-18
  • 打赏
  • 举报
回复
噢好东西 i 张长见识
FantasyFreed 2009-03-18
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 dunao 的回复:]
现在用鼠标旋转是没有问题,
问题是旋转了后选择,拖动,改变大小有问题!
[/Quote]

你的程序改变大小后拖拽没有问题,拖拽后改变大小也没问题。那为什么旋转之后拖动、改变大小有问题了呢?我觉得旋转完之后有些点(POSX,POSY等)需要从新复位
FantasyFreed 2009-03-18
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 dunao 的回复:]
现在用鼠标旋转是没有问题,
问题是旋转了后选择,拖动,改变大小有问题!
[/Quote]


我觉得设置旋转的点要在矩形的四个角的外头一点,拖动的点就在矩形线的里面,改变大小的点在矩形线上。这样就可以分开旋转,拖动,改变大小。
sxmonsy 2009-03-18
  • 打赏
  • 举报
回复
等高手来解决.
CraxyMouse 2009-03-18
  • 打赏
  • 举报
回复
现在用鼠标旋转是没有问题,
问题是旋转了后选择,拖动,改变大小有问题!
qlzf11140820 2009-03-18
  • 打赏
  • 举报
回复
关注中。。
mawering 2009-03-18
  • 打赏
  • 举报
回复
关注,学习一下!
加载更多回复(25)

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧