问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

请解释delphi的一段代码,关于画布canvas的,知道的来看下...(100分)!

发布网友 发布时间:2022-05-12 03:29

我来回答

2个回答

懂视网 时间:2022-05-12 07:51

canvas画直角坐标系

2017年3月17日

利用canvas画直角坐标系其实挺简单的,只要确定了原点(0,0)点,也可以是其他的点,只要自己知道那是原点就行!知道了原点再分别向X轴方向和Y轴方向画两条直线即可(X轴和Y轴也是相对的,这个纯看个人喜好和实际需求)。

闲话不多说直接看代码:

<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title>canvas画直角坐标系和柱状图</title>
 </head>
 <body>
 <h1>canvas画直角坐标系及柱状图</h1>
 <canvas id="canvas" width="600" height="400">如果您只看到了这句话,那么您的浏览器该升级换代了!</canvas>
  <!--canvas的宽高即可以设置成行内样式,也可以通过Js设置,不过建议设置成行内样式-->
 <script src="js/drawChart.js" type="text/javascript" charset="utf-8"></script>
 <!--为了表现与样式分离同时为了页面简洁,引入一个外部js文件-->
 <script type="text/javascript">
  var canvas=document.getElementById("canvas");
  var cxt = canvas.getContext("2d");
  //通过id获取canvas画布,并获得cxt画笔,canvas目前只支持2d效果,所以“2d”不能省;
  
  var arr = [16,15,20,21]//利用数组模拟柱状图的数据
  Coordinate(50,350);//自己写的一个直角坐标系
  ColumnChart1(50,350,arr); //一个简单的柱状图函数 
  /*为了有个简单的动画效果,canvas绘制完成以后先将它隐藏,然后用jQuery的slideDown()方法淡入显示*/
  $("#canvas").hide();
  $("#canvas").slideDown(1000); 
 </script>
 </body>
</html>

然后就是直角坐标系的绘制方法(如果那位大神看到了功能更加完善,代码量可以更加精简的,请不吝赐教,谢谢):

function Coordinate(x,y){
 //x为横坐标起点,Y为纵坐标起点
  var originX = x;
  var originY = y;
  //设置原点的那个文字的样式,并绘制出来
  cxt.font = "2rem 微软雅黑";
  cxt.fillText("0",originX-10,originY+15);//此处-10和+15是为了调整字的位置

  cxt.strokeStyle = "black";//设置坐标系X轴Y轴的颜色,绘制线条用strockeStyle属性,绘制填充色块用fillStyle属性;
  cxt.lineWidth = 3;//设置线条粗细,这里为了方便看设置了3个像素,可以根据情况自行调整
  //开始绘制Y轴
     cxt.beginPath();//开启路径
  cxt.moveTo(originX,originY);//x轴与y轴的起点位置
  cxt.lineTo(originX,originY-320);//轴的终点位置,即X大小不变,只是改变了Y点位置(根据实际情况做调整);
  cxt.stroke();//将这条线绘制出来
  //画小箭头
  cxt.moveTo(originX,originY-320);//小箭头起点位置即为Y轴终点位置
  cxt.lineTo(originX+3,originY-310);//originX+3和originY-310是设置小箭头的终点位置,小箭头的大小和尖锐程度请自行摸索
  cxt.stroke();
  cxt.moveTo(originX,originY-320);
  cxt.lineTo(originX-3,originY-310);
  cxt.stroke();
  //画横坐标
    //绘制X轴和Y轴相似
  cxt.moveTo(originX,originY);
  cxt.lineTo(originX+450,originY);
  cxt.stroke();
  //画小箭头
  cxt.moveTo(originX+450,originY);
  cxt.lineTo(originX+440,originY-3);
 cxt.stroke();
  cxt.moveTo(originX+450,originY);
  cxt.lineTo(originX+440,originY+3);
  cxt.stroke();
  cxt.fillText("Y轴",originX-5,originY-325)
 }

然后就是柱状图的绘制方法:

function ColumnChart1(x,y,arr){
 //绘制之前先清空原有的柱状图所占区域
 cxt.clearRect(x,y,500,0);
 var arrColor = ["red","yellow","blue","purple","green","mauve"];//为了使每个柱子的颜色不一样,如果可以尽量用#******或rgb()方法设置颜色,因为我这样直接用单词有些浏览器对个别颜色不识别(头疼的IE)
 //请务必保持x,y值与坐标系的x,y值相同
 this.arr= arr;
 for (var i=0;i<arr.length;i++ ) {//for循环用来遍历数组内数据
  if(i==0){
   var originX = x+40;
   var originY = y-1;
  }else{
   var originX = i*70+80;
   var originY = y-1;
  }
  cxt.beginPath();
  cxt.strokeStyle = arrColor[i];//设置线条颜色
  cxt.lineWidth = 20;//这里为了方便直接将线条的宽度设置为20,这样就可以模拟柱子
  cxt.moveTo(originX+(i+1)*20,originY);//柱子的顶点位置,这里因为数组内数字小,所以都乘十了,这样有利于小数字的表现
  cxt.lineTo(originX+(i+1)*20,originY-(arr[i]*10));//调整每根柱子的间距;
  cxt.stroke(); 
  cxt.font = "20px 宋体"
  cxt.fillText(arr[i],originX+(i+1)*20-10,originY-(arr[i]*10+3));
  //文字的绘制
  cxt.font = "13px 宋体"
  cxt.fillText("第"+(i+1)+"季度业绩",originX+(i+1)*20-35,originY+20)
  }
 }

如果还想图表看起来更加美观,可以用canvas提供的shadowColor、shadowOffsetX、shadowOffsetY等相关属性设置阴影。

同时以柱子的顶点为圆心画一个颜色略异于柱子的椭圆即可。

热心网友 时间:2022-05-12 04:59

procere TForm1.Button1Click(Sender: TObject);
var //变量定义开始
i,x,y:integer; //定义了三个整数变量
a:array[1..200] of TPoint; //定义一个以点类型为基类型的数组类型变量
begin //TPoint(点,直角坐标系上的任意一点,两个值,X和Y值)类型,它有两个最基本的变量,即X和Y,请注意这里的X,Y与上而的X,y变量无关;
x:=ClientWidth div 2; //客户区宽度整除2,
y:=ClientHeight div 2; //客户区高度整除2,
canvas.Pen.Color := clBlue; //画布.笔.颜色,设置画布上画线的笔的颜色为蓝色;
MoveWindowOrg(canvas.Handle, x, y );
canvas.MoveTo(-ClientWidth div 2, 0); //移动画笔到划线的起始点,
canvas.LineTo(ClientWidth div 2, 0); //在划布上从(-ClientWidth div 2, 0)划一条水平直线到(ClientWidth div 2, 0),
canvas.MoveTo(0, ClientHeight div 2); //移动画笔到划线的起始点,
canvas.LineTo(0, -Clientheight div 2); //在划布上从(0, ClientHeight div 2))划一条垂直线到(0, -Clientheight div 2),
x:=-100; //给变量X重新赋值,准备画抛物线
canvas.Pen.Color := clRed; //设置画布上画线的笔的颜色为红色;
for i:=1 to 200 do //给数组变量a的各个(200个)元素赋值,每个有x,y两个值
begin //开始为抛物线上的每一点位置确定值
a[i].X := 5*x; //关于抛物线上每一点的值你可以查一下高中数学中的定义
a[i].Y:=-(x*x-2*(x+1));
inc(x); // 使X每循环一次就加1,实际上这一句,等于X:=X+1;
end;
canvas.Polyline(a);//根据a变量的值画出一条抛物线 Polyline(a)是画布的画抛物线函数.
end;
以上解释不知可否,莫笑.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
intel 英特尔 酷睿 i5-9400F CPU 2.9GHz 6核6线程-详细介绍 vivo手机越用网络越慢 怎么检测 二手苹果电脑交易注意买二手苹果笔记本电脑应注意什么 比如我买一个二手笔记本卖家笔记本预装正版win10的话把他账号注销登录我... 二手苹果笔记本怎么更改账户 军婚假期有多少天 金立e6mini开机出现el 甘肃基层卫生主要内容 甘肃基层医疗卫生系统怎么撤销处方 天津市选调生通过面试了不去会怎么样 海洛斯控制屏型号 轴流风机网孔标准 国内那家有,外转子轴流风机是4个叶片的 请问哪里有国产外转子轴流风机外径D1000-1200 外传子轴流风机哪个牌子好,价格实惠点的 香港服务器租用光算云i好不好 空气源热泵价格 家用 10个月宝宝大便前面一段是黑色的,正常吗 宝宝拉屎是黑色的,而且很稀,是怎么回事? 九个月的宝宝大便是黑色的啥情况? 宝宝为什么总是大声尖叫 哪个网购比较好 我今年23岁。昨天晚上喝完酒以后,跟人过性生活,一直都射不出来,有时候还会软有时候硬的,平时没喝酒好 男人想要的时候要不到,硬得想射又射不出来,请问是什么原因? 他下面一硬他浑身发抖抖得很厉害 还时不时的软 可是他射不出来 什么原因 男人会硬但最终射不出来是什么原因 - 信息提示 弟弟硬了很久,怎麼也射不出,这是为什麼? 各类客服电话是怎么收费的?比如银行,邮局,快递,还有网购之类的。 想走游戏开发这条路,侧重于编写游戏的场景、地图与人物动作特效这方面。请问我要学习哪方面的知识? 单方解除合同是承租人在什么样的情况下 承租人单方解除合同的法定条件 默认情况下,canvas的坐标系原点位于画图区域的何处?x轴和y轴各指向何方向? 发芽种子怎么用水养 关于android软件编程中如何画函数折线图的问题 被封了,必须好友才能解封。但是好友的条件都不满足怎么办? 朋友开的美发店中途入股一人一半写合同 怎么算才合理 美发店签的入股合同,签完合同让我看了一眼,但是没有给我合同,是不是法律上不生效? 沿海和内陆中心城市对外开放的时间 从十一届三中全会以来沿海和内陆中心城市对外开放有什么作用和影响_百度问一问 中国经济最发达的内陆城市是哪个城市? 中国内陆,一线城市都有那些?二线城市都有那些城市?“高悬赏” 哪个内地城市最有可能发展成中心城市? 重庆是不是内陆的直辖市!! 沿海城市和内陆城市,哪里工作机会多? labwindows&#47;cvi中,如何在canvas控件上画一个扇形的极坐标系,可以显示其上一点 原神手机号不够用怎么办 好多美女海边游泳遇到鳄鱼袭击的是什么电影 女子在惠州海边游泳被浪卷走获救没有? 女生 去海边游泳 泳裤进水 进了一*沙子 要紧吗 会不会有卫生方面的问题