【MFC】如何画带箭头的直线

  • 前言
  • 代码
    • 获得箭头坐标

前言

如何绘制带箭头的直线,说来也简单,只需要算出箭头左右两边的坐标,再使用LineTo()函数即可。话不多说上代码。

代码

获得箭头坐标

已知直线的起点ptStar和终点ptEnd坐标,设定好箭头的夹角和需要的箭头长度,就可以调用下面的函数计算出箭头两边点的坐标。

//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:获得箭头坐标
//参数:
//      pStar   直线起始点
//      pEnd    直线终点
//      angle   箭头相对终点的夹角
//      length  箭头长
//      Arrowlf 输出箭头左边坐标
//      ArrowRt 输出箭头右边坐标
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
void CArrowDraw::GetArrowPoint(CPoint pStar, CPoint pEnd, double angle, int length, POINT &Arrowlf, POINT &ArrowRt)
{double         theta;double            Px,Py;double            Px1 ,Py1 , Px2, Py2;double          len1, len2;theta = angle / 180.0 * DRAW_PI;    //角度转弧度Px = pStar.x - pEnd.x;Py = pStar.y - pEnd.y;//向量P旋转theta角得到向量P1Px1 = Px * cos(theta) - Py * sin(theta);Py1 = Px * sin(theta) + Py * cos(theta);//向量P旋转-theta角得到向量P2Px2 = Px * cos(-theta) - Py * sin(-theta);Py2 = Px * sin(-theta) + Py * cos(-theta);//伸缩向量至指定长度len1 = sqrt(Px1 * Px1 + Py1 * Py1);Px1 = Px1 * length / len1;Py1 = Py1 * length / len1;len2 = sqrt(Px2 * Px2 + Py2 * Py2);Px2 = Px2 * length / len2;Py2 = Py2 * length / len2;//平移变量至直线末端Px1 = Px1 + pEnd.x;Py1 = Py1 + pEnd.y;Px2 = Px2 + pEnd.x;Py2 = Py2 + pEnd.y;Arrowlf.x = (int)Px1;Arrowlf.y = (int)Py1;ArrowRt.x = (int)Px2;ArrowRt.y = (int)Py2;
}

此处提供2个应用场景:绘制实心箭头和直线+箭头

void CArrowDraw::DrawArrow(CDC *pDC)
{CPoint             ptArrow[4]; CPoint              ptStar, ptEnd;CPoint                ptArrowLeft, ptArrowRight;CPen              penArrow;CBrush             brushArrow;penArrow.CreatePen(PS_SOLID, 2, RGB(255, 0, 0));brushArrow.CreateSolidBrush(RGB(255, 0, 0));//绘制指北箭头CPen *pOldPen = pDC->SelectObject(&penArrow); ptStar.x = 10;ptStar.y = 10;ptEnd.x = 20;ptEnd.y = 20;//应用1: 只绘制箭头(实心箭头带颜色)ptArrow[0].x = ptEnd.x;ptArrow[0].y = ptEnd.y;//获取箭头坐标GetArrowPoint(pStar, ptArrow[0], 30, 10, ptArrow[1], ptArrow[2]);ptArrow[3] = ptArrow[0];CBrush *pOldBrush = pDC->SelectObject(&brushArrow);pDC->Polygon(ptArrow, 4);pDC->SelectObject(pOldBrush);//应用2:直线+箭头GetArrowPoint(ptStar, ptEnd, 30, 10, ptArrowLeft, ptArrowRight);pDC->MoveTo(ptStar.x,ptStar.y);pDC->LineTo(ptEnd.x,ptEnd.y);pDC->MoveTo(ptEnd.x,ptEnd.y);pDC->LineTo(ptArrowLeft.x, ptArrowLeft.y);pDC->MoveTo(ptEnd.x,ptEnd.y);pDC->LineTo(ptArrowRight.x, ptArrowRight.y);pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush);//释放资源penArrow.DeleteObject();brushArrow.DeleteObject();
}

【MFC】如何画带箭头的直线相关推荐

  1. CAD里面怎么画带箭头的直线

    转自:http://jingyan.baidu.com/article/9113f81b0192e72b3214c709.html?st=2&os=0&bd_page_type=1&a ...

  2. 关于google地图api3的离线和在线开发(画带箭头的直线,指定范围,搜索,计算距离)

    最近因为开发的需要,要做一个离线的google地图.并且能够加载google地图的一些特效.例如:地图的标记,计算距离,获取标记的经纬度,画带有箭头的直线,获取指定范围的数据等等.在这里我总结了很多开 ...

  3. MFC画带箭头的直线

    构造一个函数,是在startPoint,endPoint间画一条带箭头的线段: void CTry1View::DrawLine(POINT startPoint, POINT endPoint) { ...

  4. 关于利用canvas画带箭头的直线旋转

    利用canvas在Vue项目中使用: <imgid="range_right"src=""style="position: absolute;l ...

  5. delphi 画 带箭头的线

    unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Di ...

  6. html5画直线箭头,HTML5 canvas画带箭头的虚线

    今天给大家讲解的是在HTML5 canvas画带箭头的虚线.关于Canvas 对象表示一个 HTML 画布元素 -.它没有自己的行为,但是定义了一个 API 支持脚本化客户端绘图操作. 本案例注意事项 ...

  7. Android Canvas绘制带箭头的直线

    先看下效果图: 下面我们直接看代码 我自定义了一个View,代码如下: package com.davis.drawtrangle;import android.content.Context; im ...

  8. Raphael绘制流程图(二),添加带箭头的直线

    上一篇文章中,我们添加了元素(矩形框),接下来给矩形框加上带箭头的直线,代码如下: var wf_r = null; //画板对象 var wf_steps = []; //步骤数组 var wf_w ...

  9. Matlab任意两点之间绘制带箭头的直线

    Matlab任意两点之间绘制带箭头的直线 简单绘制任意两点之间.本来不想自己写的,可是网上的代码用起来不舒服,所以简单看看原理,原来就是个坐标变换而已.索性自己写了一份,分享如下: function ...

最新文章

  1. 我作为Java后端,分享一下入门Spark编程的经历!
  2. Object.defineProperty与双向绑定、数据监听
  3. Safari 14.0 的功臣 Webp?
  4. leetcode139. 单词拆分
  5. u8系统怎么连接服务器,用友U8 怎么连接远程服务器
  6. 卷积神经网络-进化史 | 从LeNet到AlexNet
  7. vmware虚拟机里的LINUX不能上网的原因一:虚拟网卡设置
  8. Windows加域提示 已超出此域允许的创建的计算机账户的最大值,请联系统管理员
  9. 像素越多越好?像元的面积越小越好?
  10. java移位运算符实验程序:lt;lt;(左移)、gt;gt;(带符 号右移)和gt;gt;gt;(无符号右移)...
  11. 当我们调用yield,它究竟做了什么
  12. 微信小程序实现登录Java前后端分离
  13. UCHome全面大解析【二】----基本体系结构
  14. 架构师之路 — 架构师的职责
  15. win7添加打印机提示没有权限访问网络资源 网络不可用
  16. 灯的开关状态 :有 N 个灯放在一排,从 1 到 N 依次顺序编号。有 N 个人也从 1 到 N 依次编号。1 号将灯 全部关闭,2 将凡是 2 的倍数的灯 打开;3 号将凡是 3 的倍数的灯作相
  17. ThoughtWorks史凯: 数字化转型不是技术变革,而是企业灵魂深处的自我革命
  18. 微信多订单合并付款_拼多多怎样合并付款?
  19. Nginx官方文档(十一)【HTTP之ngx_http_core_module】
  20. java基本微信小程序的琴房预约管理系统 uniapp 小程序

热门文章

  1. Java项目你们期待的热门游戏-王者荣耀
  2. 没有任何一个直男能活着逃过520
  3. 一位老师对学生的人生寄语(Z)
  4. 推荐一个来自台湾的前端博客,以及另外一个
  5. 漫画算法python篇_有点意思!当漫画遇上算法后(儿童节福利)
  6. 唐宇迪学习笔记1:Python环境安装、Pytho科学计算库——Numpy
  7. 这些Redis内容你了解多少?
  8. 王者服务器维护到什么时候2021,王者荣耀怎么解除健康系统时间限制2021 王者荣耀怎么解除禁赛限制...
  9. 设置input标签不可编辑
  10. 一个英文拼写纠错的思路(English Spelling check)