CPoint2D CTraverseNetCalcu::LP2CP(const CPoint2D& Point, CRect& rect)//逻辑坐标转客户区坐标 { CPoint2D P; P = Point; P.y_draw = rect.Height() - (Point.x - x_min) * k; P.x_draw = (Point.y - y_min) * k; P.y_draw -= rect.Width() / 10; P.x_draw += rect.Height() / 10; return P; }
时间: 2023-12-03 10:03:23 浏览: 134
这段代码实现了一个名为`LP2CP`的函数,用于将逻辑坐标转换为客户区坐标。
该函数接受一个逻辑坐标`Point`和一个矩形区域`rect`作为输入参数。
首先,创建一个空的`CPoint2D`对象`P`。
然后,将输入的逻辑坐标的x轴值减去`x_min`并乘以`k`,将结果赋值给`P.y_draw`,表示转换后的y轴值。
接着,将输入的逻辑坐标的y轴值减去`y_min`并乘以`k`,将结果赋值给`P.x_draw`,表示转换后的x轴值。
然后,将转换后的y轴值减去客户区宽度的1/10,将结果赋值给`P.y_draw`,表示向上调整了一定比例。
最后,将转换后的x轴值加上客户区高度的1/10,将结果赋值给`P.x_draw`,表示向右调整了一定比例。
最终,返回转换后的客户区坐标`P`。
相关问题
在MFC中,已知一个矩形在坐标系中间且四个顶点坐标确定,求它关于原点旋转45度后的顶点坐标的代码
在 MFC 中,可以利用 `CPoint` 类来表示点的坐标,利用 `CRect` 类来表示矩形。已知矩形的四个顶点坐标为 `(x1, y1)`, `(x2, y2)`, `(x3, y3)`, `(x4, y4)`,则可以利用以下代码计算出该矩形绕原点逆时针旋转45度后的四个顶点坐标:
```
#include <math.h>
CPoint RotatePoint(const CPoint& pt, double angle)
{
// 将点 pt 绕原点逆时针旋转 angle 度后的新坐标
double radian = angle * M_PI / 180.0;
int new_x = (int)(pt.x * cos(radian) - pt.y * sin(radian));
int new_y = (int)(pt.x * sin(radian) + pt.y * cos(radian));
return CPoint(new_x, new_y);
}
CRect RotateRect(const CRect& rect, double angle)
{
CPoint pt1(rect.left, rect.top);
CPoint pt2(rect.right, rect.top);
CPoint pt3(rect.right, rect.bottom);
CPoint pt4(rect.left, rect.bottom);
pt1 = RotatePoint(pt1, angle);
pt2 = RotatePoint(pt2, angle);
pt3 = RotatePoint(pt3, angle);
pt4 = RotatePoint(pt4, angle);
int left = min(min(pt1.x, pt2.x), min(pt3.x, pt4.x));
int top = min(min(pt1.y, pt2.y), min(pt3.y, pt4.y));
int right = max(max(pt1.x, pt2.x), max(pt3.x, pt4.x));
int bottom = max(max(pt1.y, pt2.y), max(pt3.y, pt4.y));
return CRect(left, top, right, bottom);
}
```
这里定义了两个函数:`RotatePoint` 和 `RotateRect`。`RotatePoint` 函数用于将点 `pt` 绕原点逆时针旋转指定的角度 `angle` 度,返回旋转后的新坐标。`RotateRect` 函数则利用 `RotatePoint` 函数来计算出矩形的四个顶点旋转后的坐标,再根据旋转后的四个顶点坐标来确定旋转后的矩形的位置和大小。最终,`RotateRect` 函数返回旋转后的矩形。
在调用 `RotateRect` 函数时,只需要将原始矩形作为参数传入即可。例如:
```
CRect rect(x1, y1, x4, y4);
CRect rotated_rect = RotateRect(rect, 45.0);
```
其中,`x1`、`y1`、`x4`、`y4` 分别表示原始矩形的左上角和右下角的坐标。`rotated_rect` 即为旋转后的矩形。
mfc完成简单画板程序的设计,要求有:利用 MFC/QT 的向导,创建基于单文档的应用程序;图像互相重叠时,能正确显示图像。给出详细代码
以下是一个基于 MFC 的简单画板程序设计的代码,实现了绘制直线、矩形和椭圆三种基本图形的功能。在图形重叠时,采用了透明度的方式来显示图形。
首先,使用 MFC/QT 的向导创建一个基于单文档的应用程序,然后在 CMyPaintDoc 类中添加以下成员变量和函数:
```c++
class CMyPaintDoc : public CDocument
{
protected:
CObArray m_arrShapes; // 保存图形的数组
int m_nPenWidth; // 画笔宽度
COLORREF m_clrPenColor; // 画笔颜色
public:
// 添加图形的函数
void AddShape(CShape* pShape);
// 获取图形数组的大小
int GetShapeCount() const;
// 获取指定索引处的图形
CShape* GetShape(int nIndex) const;
// 清空图形数组
void ClearShapes();
// 设置画笔宽度
void SetPenWidth(int nWidth);
// 获取画笔宽度
int GetPenWidth() const;
// 设置画笔颜色
void SetPenColor(COLORREF clr);
// 获取画笔颜色
COLORREF GetPenColor() const;
};
```
在 CMyPaintDoc 类的实现文件中,添加以下代码:
```c++
void CMyPaintDoc::AddShape(CShape* pShape)
{
m_arrShapes.Add(pShape);
SetModifiedFlag(); // 文档已被修改,需要保存
}
int CMyPaintDoc::GetShapeCount() const
{
return m_arrShapes.GetSize();
}
CShape* CMyPaintDoc::GetShape(int nIndex) const
{
return (CShape*)m_arrShapes.GetAt(nIndex);
}
void CMyPaintDoc::ClearShapes()
{
for (int i = 0; i < GetShapeCount(); i++)
delete GetShape(i);
m_arrShapes.RemoveAll();
SetModifiedFlag(); // 文档已被修改,需要保存
}
void CMyPaintDoc::SetPenWidth(int nWidth)
{
m_nPenWidth = nWidth;
}
int CMyPaintDoc::GetPenWidth() const
{
return m_nPenWidth;
}
void CMyPaintDoc::SetPenColor(COLORREF clr)
{
m_clrPenColor = clr;
}
COLORREF CMyPaintDoc::GetPenColor() const
{
return m_clrPenColor;
}
```
接下来,在 CMyPaintView 类中添加以下成员变量和函数:
```c++
class CMyPaintView : public CView
{
protected:
CPoint m_ptPrev; // 前一个点
int m_nDrawMode; // 绘制模式
CShape* m_pCurShape; // 当前绘制的图形
public:
CMyPaintDoc* GetDocument() const;
// 绘制直线
void DrawLine(const CPoint& ptFrom, const CPoint& ptTo);
// 绘制矩形
void DrawRect(const CPoint& ptFrom, const CPoint& ptTo);
// 绘制椭圆
void DrawEllipse(const CPoint& ptFrom, const CPoint& ptTo);
// 设置绘制模式
void SetDrawMode(int nMode);
// 获取绘制模式
int GetDrawMode() const;
};
```
在 CMyPaintView 类的实现文件中,添加以下代码:
```c++
CMyPaintDoc* CMyPaintView::GetDocument() const
{
return reinterpret_cast<CMyPaintDoc*>(m_pDocument);
}
void CMyPaintView::DrawLine(const CPoint& ptFrom, const CPoint& ptTo)
{
CDC* pDC = GetDC();
CPen pen(PS_SOLID, GetDocument()->GetPenWidth(), GetDocument()->GetPenColor());
CPen* pOldPen = pDC->SelectObject(&pen);
pDC->MoveTo(ptFrom);
pDC->LineTo(ptTo);
pDC->SelectObject(pOldPen);
ReleaseDC(pDC);
}
void CMyPaintView::DrawRect(const CPoint& ptFrom, const CPoint& ptTo)
{
CDC* pDC = GetDC();
CPen pen(PS_SOLID, GetDocument()->GetPenWidth(), GetDocument()->GetPenColor());
CBrush brush(GetDocument()->GetPenColor());
CBrush* pOldBrush = pDC->SelectObject(&brush);
CPen* pOldPen = pDC->SelectObject(&pen);
pDC->Rectangle(CRect(ptFrom, ptTo));
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
ReleaseDC(pDC);
}
void CMyPaintView::DrawEllipse(const CPoint& ptFrom, const CPoint& ptTo)
{
CDC* pDC = GetDC();
CPen pen(PS_SOLID, GetDocument()->GetPenWidth(), GetDocument()->GetPenColor());
CBrush brush(GetDocument()->GetPenColor());
CBrush* pOldBrush = pDC->SelectObject(&brush);
CPen* pOldPen = pDC->SelectObject(&pen);
pDC->Ellipse(CRect(ptFrom, ptTo));
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
ReleaseDC(pDC);
}
void CMyPaintView::SetDrawMode(int nMode)
{
m_nDrawMode = nMode;
}
int CMyPaintView::GetDrawMode() const
{
return m_nDrawMode;
}
```
最后,在 CShape 类中添加以下成员变量和函数:
```c++
class CShape
{
protected:
CPoint m_ptFrom; // 起点
CPoint m_ptTo; // 终点
int m_nPenWidth; // 画笔宽度
COLORREF m_clrPenColor; // 画笔颜色
public:
CShape(const CPoint& ptFrom, const CPoint& ptTo, int nPenWidth, COLORREF clrPenColor);
virtual ~CShape();
CPoint GetFromPoint() const;
CPoint GetToPoint() const;
int GetPenWidth() const;
COLORREF GetPenColor() const;
virtual void Draw(CDC* pDC) = 0; // 纯虚函数,绘制图形
};
```
在 CShape 类的实现文件中,添加以下代码:
```c++
CShape::CShape(const CPoint& ptFrom, const CPoint& ptTo, int nPenWidth, COLORREF clrPenColor)
{
m_ptFrom = ptFrom;
m_ptTo = ptTo;
m_nPenWidth = nPenWidth;
m_clrPenColor = clrPenColor;
}
CShape::~CShape()
{
}
CPoint CShape::GetFromPoint() const
{
return m_ptFrom;
}
CPoint CShape::GetToPoint() const
{
return m_ptTo;
}
int CShape::GetPenWidth() const
{
return m_nPenWidth;
}
COLORREF CShape::GetPenColor() const
{
return m_clrPenColor;
}
```
然后,分别创建 CLineShape、CRectShape 和 CEllipseShape 类,继承自 CShape 类,实现 Draw 函数,绘制直线、矩形和椭圆图形。
最后,在 CMyPaintView 类中添加以下代码,实现绘制图形和鼠标事件的处理:
```c++
void CMyPaintView::OnDraw(CDC* pDC)
{
CMyPaintDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
for (int i = 0; i < pDoc->GetShapeCount(); i++)
{
CShape* pShape = pDoc->GetShape(i);
ASSERT_VALID(pShape);
if (pShape)
pShape->Draw(pDC);
}
}
void CMyPaintView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_ptPrev = point;
switch (GetDrawMode())
{
case DRAW_LINE:
m_pCurShape = new CLineShape(point, point, GetDocument()->GetPenWidth(), GetDocument()->GetPenColor());
break;
case DRAW_RECT:
m_pCurShape = new CRectShape(point, point, GetDocument()->GetPenWidth(), GetDocument()->GetPenColor());
break;
case DRAW_ELLIPSE:
m_pCurShape = new CEllipseShape(point, point, GetDocument()->GetPenWidth(), GetDocument()->GetPenColor());
break;
}
CView::OnLButtonDown(nFlags, point);
}
void CMyPaintView::OnMouseMove(UINT nFlags, CPoint point)
{
if (nFlags & MK_LBUTTON && m_pCurShape)
{
CClientDC dc(this);
dc.SetROP2(R2_NOTXORPEN);
m_pCurShape->Draw(&dc);
switch (GetDrawMode())
{
case DRAW_LINE:
m_pCurShape->GetToPoint() = point;
break;
case DRAW_RECT:
case DRAW_ELLIPSE:
m_pCurShape->GetToPoint().x = point.x;
m_pCurShape->GetToPoint().y = point.y;
break;
}
m_pCurShape->Draw(&dc);
}
CView::OnMouseMove(nFlags, point);
}
void CMyPaintView::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_pCurShape)
{
CClientDC dc(this);
m_pCurShape->Draw(&dc);
GetDocument()->AddShape(m_pCurShape);
m_pCurShape = NULL;
}
CView::OnLButtonUp(nFlags, point);
}
void CMyPaintView::OnInitialUpdate()
{
CView::OnInitialUpdate();
SetDrawMode(DRAW_LINE); // 默认绘制直线
SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize());
}
void CMyPaintView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
CMyPaintDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
if (lHint == NULL) // 全部更新
{
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
Invalidate();
}
else // 部分更新
{
CRect* pRect = (CRect*)lHint;
InvalidateRect(pRect);
}
}
```
最后,在 CShape 类中添加以下代码,实现透明度的方式显示图形:
```c++
void CShape::Draw(CDC* pDC)
{
CRect rc(m_ptFrom, m_ptTo);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMem.SelectObject(&bmp);
dcMem.FillSolidRect(0, 0, rc.Width(), rc.Height(), RGB(255, 255, 255)); // 白色背景
dcMem.SetBkMode(TRANSPARENT);
CPen pen(PS_SOLID, m_nPenWidth, m_clrPenColor);
CPen* pOldPen = dcMem.SelectObject(&pen);
CBrush brush(m_clrPenColor);
CBrush* pOldBrush = dcMem.SelectObject(&brush);
DrawShape(&dcMem); // 绘制图形
dcMem.SelectObject(pOldBrush);
dcMem.SelectObject(pOldPen);
dcMem.SelectObject(pOldBitmap);
pDC->BitBlt(m_ptFrom.x, m_ptFrom.y, rc.Width(), rc.Height(), &dcMem, 0, 0, SRCCOPY);
}
void CLineShape::DrawShape(CDC* pDC)
{
pDC->MoveTo(m_ptFrom);
pDC->LineTo(m_ptTo);
}
void CRectShape::DrawShape(CDC* pDC)
{
pDC->Rectangle(CRect(m_ptFrom, m_ptTo));
}
void CEllipseShape::DrawShape(CDC* pDC)
{
pDC->Ellipse(CRect(m_ptFrom, m_ptTo));
}
```
至此,一个基于 MFC 的简单画板程序就完成了。完整的代码如下:
阅读全文