2022-09-18
运行结果图:

点击上面的红色图标后:

点击“确定”后:

绘图步骤:
(1)打开vs,点击“文件”,点击“新建”,点击“项目”。填写项目名称,例如:“adamas”,修改存放的路径,点击“下一步”。“应用程序类型”选择“单个文档”,“项目样式”选择“MFC standard”,点击“完成”。
(2)为运行结果图添加菜单与按钮的步骤:
创建菜单:
首先,找到“资源”,点击,找到“其他窗口”,点击“资源视图”。在“资源视图”栏中点击“adamas”,展开后,点击“adamas.rc”,找到“menu”文件夹后点击,展开后,点击“IDR_MAINFRAME”。
将“IDR_MAINFRAME”中的菜单栏多余的部分删除,只留下“文件(F)”,“帮助(H)”。在“文件”的下拉菜单中只留下“退出(X)”。在“文件”,“帮助”菜单的后面添加“图形(D)”,在“图形(D)”的下拉框中添加“绘图”。样式如下:

改变菜单中“绘图”的属性。选中“绘图”,右击,“属性”,在右面的属性栏中找到ID,将其ID改为“IDM_DRAWPIC”。
---------------------------------------------------------------------
创建图标:
在“资源视图”中,点击“toolbar”文件夹,在出现的图标中,第一行不需要的图标都拖到第二行的坐标去掉,在最后一个空白的图标中使用工具栏中的铅笔工具绘制一个红色的绘图图标。之后选中该图标,右击“属性”,在右边的属性栏中找到"ID",将“ID”改为“IDM_DRAWPIC”。
(3)添加一个对话框的步骤:
找到“资源视图”,点击“Dialog”文件夹,右击“添加资源”,点击“新建”。在对话框中添加工具,找到左边的“工具栏”,点击。将“Static Text”拖动到对话框中,要添加两回,因此拖动两次。先随意放到对话框中的任意位置。将工具栏中的“Edit Control”同理也添加两次。在对话框中有一个“确定”和一个“取消”按钮。选中“取消”按钮,按键盘上的“Delete”键删除。
在对话框中,选中其中一个“Static Text”,右击“属性”,找到“Caption”,将其右边的“static”改为“等分点的个数”。同样的方式,将另一个“Static Text”的显示名称改为“圆的半径”。如下图:

双击此对话框,在弹出的“添加MFC类”框中,输入要添加的类,例如:“CInputDlg”,点击“确定”。
为输入对话框成员变量,点击“项目”,点击“类向导”。将“类名”定位到“CInputDlg”,点击“成员变量”,双击第一个控件“IDC_EDIT1”,在弹出的“添加控件”的框中,“类别”选择“值”、“名称”写为“m_n”、“变量类型”写为“int”,在“控件”的下面点击“其他”,在这儿,“最小值”设为“5”、“最大值”设为“50”,点击“完成”。如下:


控件2按照同样的方式,双击“IDC_EDIT2”,在弹出的“添加控件”的框中,“类别”选择“值”、“名称”写为“m_r”、“变量类型”写为“double”,在“控件”的下面点击“其他”,在这儿,“最小值”设为“200.0”、“最大值”设为“320.0”,点击“完成”。
(4)给对话框的源文件编写代码
首先在构造函数中,设置“圆的半径”为“300.0”,“圆的等分点”为“30”。找到“解决方案资源管理器”,点击“源文件”文件夹,点击“CInputDlg.cpp”。在构造函数中初始化内容。
1 CInputDlg::CInputDlg(CWnd* pParent /*=nullptr*/)
2 : CDialogEx(IDD_DIALOG1, pParent)
3 , m_n(0)
4 , m_r(0)
5 {
6 m_n = 30;
7 m_r = 300.0;
8 }
设计“编辑框”的初始状态为选中状态。步骤:
点击“项目”,点击“类向导”,将类名定位到“CInputDlg”,点击“消息”,在“搜索框”中搜索“ShowWindow”,在下面的栏中,双击出现的选项“WM_SHOWWINDOW”,将其添加到右边的“现有处理程序”中。在右边的“现有处理程序”中选中“OnShowWindow”,点击右边的“编辑代码”的选项。代码如下:
1 void CInputDlg::OnShowWindow(BOOL bShow, UINT nStatus)
2 {
3 CDialogEx::OnShowWindow(bShow, nStatus);
4
5 // TODO: 在此处添加消息处理程序代码
6 GetDlgItem(IDC_EDIT1)->SetFocus();//将光标移动到控件1(IDC_EDIT1)的编辑框()edit中
7 ((CEdit *)GetDlgItem(IDC_EDIT1))->SetSel(0, -1);//表示编辑控件中的全部文本被选中
8
9 }
(5)添加一个二维点类
点击“项目”,点击“添加类”,类名设置为“CP2”。在头文件中添加成员变量x、y,在它的源文件中的构造函数,设置x、y的初始值为0.
CP2.h文件
1 #pragma once
2 class CP2
3 {
4 public:
5 CP2(void);
6 ~CP2(void);
7 public:
8 double x;
9 double y;
10 };
CP2.cpp文件
1 #include "pch.h"
2 #include "CP2.h"
3 CP2::CP2(void) {
4 x = 0;
5 y = 0;
6 }
7
8 CP2::~CP2(void) {
9 }
(6)打开“adamasView.h”文件,添加成员变量与函数
添加“CP2.h”头文件
#include"CP2.h"
添加成员变量,在第三个“protected:”下面添加
1 protected:
2 CP2 *p;//动态数组p
3 int n;//等分点的个数
4 double r;//圆的半径
添加绘制金刚石的函数,在从上往下数的第二个“public:”下面添加一行代码
void Diamond();
(7)对菜单栏中的“绘图”选项添加“事件处理程序”,并编写代码
选择“资源视图”,点击“Menu”文件夹,点击“IDR_MAINFRAME”,找到“绘图”,选中,右击“添加事件处理程序”,在弹出的框中“类列表”选择“CadamasView”,点击“确定”。
OnDrawpic函数
1 void CadamasView::OnDrawpic()
2 {
3 // TODO: 在此添加命令处理程序代码
4 CInputDlg dlg;
5 if (IDOK == dlg.DoModal()) {
6 n = dlg.m_n;
7 r = dlg.m_r;
8 }
9 else
10 {
11 return;
12 }
13 RedrawWindow();
14 p = new CP2[n];
15 Diamond();
16 delete[]p;
17 }
说明:
第4行代码,定义了一个“CInputDlg”类(对话框)的对象。
第5行代码“dlg.DoModal”是指显示一个“模态对话框”,“模态对话框”是值如果我们想要执行其他的应用程序时,必须点击该弹出来的“模态对话框”中的“确定”或者点击“叉号”,对该对话框进行相应。“IDOK”是指如果用户点击了“确定”后执行的代码。
第6,7行代码指的是将对话框接收到的“等分点的个数”与“圆的半径”传到内部函数中,进行信息处理。第9-12行代码表示,如果用户在弹出的“模态对话框”中选择点击模态对话框的“叉号”,则不做操作。
第13行代码“RedrawWindow()”表重绘窗口函数,应该是指在弹出的“模态对话框”选择后,进行对函数后台的处理,按照不同的选择进行重新刷新。
第14行代码指的是按照在对话框中输入的“等分点的个数n”进行动态的创建一个一维数组,存放传进来的数字。
第15行绘制金刚石的函数。
第16行在程序末尾,将动态数组占用的空间释放。
Diamond函数代码:
1 void CadamasView::Diamond() {
2 CDC *pDC = GetDC();
3 CRect rect;
4 GetClientRect(&rect);
5 pDC->SetMapMode(MM_ANISOTROPIC);
6 pDC->SetWindowExt(rect.Width(), rect.Height());
7 pDC->SetViewportExt(rect.Width(), -rect.Height());
8 pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);
9 rect.OffsetRect(-rect.Width() / 2,-rect.Height() / 2);
10 CPen NewPen, *pOldPen;
11 NewPen.CreatePen(PS_SOLID, 1, RGB(255,215 , 0));
12 pOldPen = pDC->SelectObject(&NewPen);
13 double Alpha, Theta;
14 Theta = 2 * PI / n;
15 Alpha = PI / 2 - Theta;
16 for (int i = 0; i < n; i++) {
17 p[i].x = r * cos(i*Theta + Alpha);
18 p[i].y = r * sin(i*Theta + Alpha);
19 }
20 for (int i = 0; i <= n - 2; i++) {
21 for (int j = i + 1; j <= n - 1; j++) {
22 pDC->MoveTo(round(p[i].x), round(p[i].y));
23 pDC->LineTo(round(p[j].x), round(p[j].y));
24 }
25 }
26 pDC->SelectObject(pOldPen);
27 NewPen.DeleteObject();
28 ReleaseDC(pDC);
29 }
说明:
第2行代码中使用GetDC()函数创建了一个CDC类的对象,CDC类的对象调用CDC内部的成员函数可以完成大部分的绘图操作。*pDC是一个指针,可用于将其他内容选入设备上下文。
第3行代码创建了一个矩形,第4行代码是将创建好的矩形作为参数传入“GetClientRect”客户区矩形的函数中。此处,客户区矩形与窗口矩形的区别是:窗口矩形包含客户区矩形,客户区矩形是不包含外框和菜单栏的。
第5行代码“SetMapMode”表示的是设置映射模式。什么是映射模式?通俗地说,映射模式就是指将输入内容x,y大小与显示器和打印机输出的图形的大小转变为一致。即将输入的逻辑单位(一般是英尺或者毫米)与输出的物理单位(一般数像素或者是点阵数)转化为一致的。“ MM_ANISOTROPIC”是一种映射模式,指的是“ 用户定义的值,但是x和y方向任意”。
第6行代码“SetWindowExt”是指设置窗口的宽和高。是逻辑单位的大小。
第7行代码“SetViewportExt”是指设置视图的尺寸。指的是物理单位。此处,将x轴的方向设置为从左向右,将y轴的方向设置为从下到上。
第8行代码,设置视图中心点的位置,中心点位于客户区宽度的一半,客户区高度的一半。
第9行代码,是指客户区与矩形重合。
第10行代码定义了一个新画笔、一个旧画笔的指针。第11行创建了一个新画笔,实线、1像素、金色。第12行将新画笔选入设备上下文即显示在显示器上,不使用系统默认的画笔(系统默认的画笔是实线、1像素、黑色)。
第13行定义了两个变量。Theta:等分角的度数。Alpha:起始角。第14行,使用PI时,要在上面声明一个宏。
#define PI 3.14
第16-19行,依次找到所有等分点的x、y坐标。
第20-25行,依次将各个等分点与其他等分点连接。第22行,使用round函数时,要添加一个头文件。
#include<math.h>
第26行恢复设备上下文,即将原来系统默认的画笔恢复。第27行删除新创建的画笔。第28行释放设备上下文占用的资源。
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
类似:Whatgraphingpackages/APIsexistforPerl?我正在对不同语言的在线图形包进行一些研究,想知道当前有哪些适用于Ruby的最新图形包值得研究。所需的最低功能应包括Google通过itsAPI提供的功能.如能简要介绍所推荐的包/API的主要优势,我们将不胜感激。 最佳答案 我已将以下内容添加为书签,以便在时间允许时进行调查:基于Flash我还没有尝试过这些,但如果你想要活泼的动画,它们看起来都很有前途:amChartsFusionChartsOpenFlashChartZiyagemGoogleCha
资源下载地址:https://download.csdn.net/download/sheziqiong/86763967资源下载地址:https://download.csdn.net/download/sheziqiong/86763967基于C++实现一个支持简单交互绘图小程序一、概要设计1.1开发环境IDE:VisualStudio2019Commity运行环境:window10专业版配置要求:内存4g显卡无要求CPU无要求目的调试编译通过图形应用编码、熟悉flk1.2结构化模块设计图UML类图1.3主要模块功能接口描述Graph.cppvoidShape::add(Pointp)//
ChatGPT和Typescript。我正在尝试使用Zingchart绘制图表。我经历了5分钟的快速入门以及angular2页面中的教程,并对它的工作原理有了一个不错的了解。我按照Zingchart页面上的说明使用这两个工具(https://blog.zingchart.com/2016/03/16/angular-2-example-zingchart/)在网页上创建了一个图表。但是,我似乎遇到了问题。1)我无法从@angular/core导入AfterView。尽管页面上说我必须使用angular2/
我正在使用GMapsAPIv3DrawingManager让用户在map上绘制形状。我可以使用complete事件在将形状添加到map时触发操作(例如overlaycomplete或polygoncomplete)--但我也允许用户编辑完成的形状。有没有办法在形状改变时触发Action?当修改形状时,我看不到任何方式来触发另一个函数。 最佳答案 可在此处找到编辑事件列表:EditableeventsDraggingevents下面是一个例子,当圆的半径发生变化时如何将它与DrawingManager一起使用:google.maps.
我想知道是否有任何使用JavaScript在客户端运行的二维图形绘制库?基本思想是您可以在浏览器中放置一个绘图,用户可以更改X和Y比例和限制、放大和缩小等内容,而无需不断地从服务器重新加载网页。数据本身将通过AJAX获取,如果用户想使用重型工具,这将允许用户直接从服务器wget获取数据。类似于Python的matplotlib的2D部分。这是我很久以前看过的东西,然后决定开发一些只在服务器端生成SVG的代码(使用内置的eCos网络服务器)会更快,但现在我'我一直在阅读Prototype和jQuery之类的东西,我想知道是否有人已经这样做了。 最佳答案
看这段代码:这是一个谷歌工具,可以在map上创建一个面板并帮助我们绘制形状。通过drawingMode:google.maps.drawing.OverlayType.CIRCLE我们可以指示在第一次加载时选择了哪个工具,但我想在程序中更改它。例如,我想通过单击按钮将CIRCLE更改为POLYGON。我怎样才能做这样的事情?drawingManager=newgoogle.maps.drawing.DrawingManager({drawingMode:google.maps.drawing.OverlayType.CIRCLE,drawingControl:true,drawingC
我目前正在处理由我的前任编写的批处理脚本的可视化结构,它只是从某处重复SELECT和INSERT到某处。我尝试使用树函数,但当我希望将JSON的相同索引中的相同名称识别为相同节点时,使用起来并不灵活。所以我决定使用强制布局功能,并且在谷歌搜索的帮助下几乎完成了。然而,虽然我可以在同一区域映射同一组数据库或脚本来初始化部分,但不知何故force.on("tick",function()~~重新计算每个节点之间的距离然后它变得非常困惑。但没有这个,它不会显示节点之间的链接。有谁知道如何在使用JSON重新计算链接时固定布局。我的代码是这样的:node.append("circle").att
我正在努力寻找有关如何在谷歌地图中实现此效果的任何最新相关信息。我希望有人比我更了解这个问题,并能为我指明正确的方向。问题:我需要通过邮政编码在map上绘制X数量的图钉。第二步是输入我自己的邮政编码,并生成第一步中绘制的最接近的5个邮政编码列表。 最佳答案 此代码会告诉您最接近您在框中输入的邮政编码。我敢肯定,您可以从这里对其进行调整以提供前5名结果。我能够适应Geocodingsamplecode:GoogleMapsJavaScriptAPIv3Example:GeocodingSimplevargeocoder;varmap;