1.有哪些值得推荐的码分前端3D库或其他可视化库?
2.çè±ä»£ç ç¼ç¨python(ç«ç°è±ä»£ç ç¼ç¨python)
3.怎么把一个text文本转换成canvas对象
4.Vue3 + Three.js + antvG2 实战智慧城市
5.从零开始学G6
有哪些值得推荐的前端3D库或其他可视化库?
在前端开发的世界里,视觉呈现的码分力量不容忽视。让我们一起探索那些引领潮流的码分3D库和可视化库,它们不仅提升用户体验,码分更是码分创新设计的得力助手。以下是码分teqc 源码一些值得推荐的瑰宝:1. ECharts.js
作为百度出品的图形库,ECharts历经多代迭代,码分文档中的码分图表种类丰富。早期在信息可视化领域,码分它的码分图表设计备受赞誉。然而,码分虽然功能强大,码分移动端兼容性和性能上可能有待提升,码分特别是码分在处理地图这类地理坐标需求时,可能需要额外的码分工作。 而今,传奇源码制作软件蚂蚁金服的G2.js崭露头角,凭借其五月发布的正式版,采用canvas技术,提供了丰富多样的图表类型。G2更强调"图形语言"的教育性,不仅提供直观的图表设计,还深入讲解了信息可视化的规范和组件库,对于初学者来说,是一个极好的入门选择。 然后,让我们聚焦于D3.js,这个使用SVG技术的库,以其独特的灵活性和创作潜力而闻名。尽管我尚未深入使用,但同事的图集源码模板下载分享和官网的案例揭示了它在图形绘制上的无限可能,即使是复杂的可视化设计,D3都能轻松胜任。 每一种库都有其独特之处,选择取决于项目需求和开发者偏好。无论你是追求极致的视觉效果,还是寻求易用性和规范性,这些前端视觉工具都能助你一臂之力。在实际应用中,结合案例和源码学习,无疑能让你的前端世界更加丰富多彩。çè±ä»£ç ç¼ç¨python(ç«ç°è±ä»£ç ç¼ç¨python)
æ¾çè±ç代ç
#-*-coding:utf-8-*-importmath,random,timeimportthreadingimporttkinterastkimportreuuidFireworks=[]maxFireworks=8height,width=,classfirework(object):def__init__(self,color,speed,width,height):=uuid.uuid1()self.radius=random.randint(2,4)~4åç´ self.color=colorself.speed=speed.5-3.5ç§self.status=0ï¼status=0ï¼çç¸åï¼status=1ï¼å½statusæ¶ï¼çè±ççå½æç»æ¢self.nParticle=random.randint(,)self.center=[random.randint(0,width-1),random.randint(0,height-1)]self.oneParticle=[]ï¼%ç¶ææ¶ï¼self.rotTheta=random.uniform(0,2*math.pi)ï¼x=a*cos(theta),y=b*sin(theta)=[a,b]
pythonç«é ·çè±è¡¨ç½æºä»£ç æ¯å¤å°ï¼å¦å®æ¬æç¨åï¼ä½ ä¹è½ååºè¿æ ·ççè±ç§ã
å¦ä¸å¾ç¤ºï¼æ们è¿ééè¿è®©ç»é¢ä¸ä¸ä¸ªç²ååè£ä¸ºXæ°éçç²åæ¥æ¨¡æçç¸ææãç²åä¼åçï¼è¨èâï¼æææ¯å®ä»¬ä¼ä»¥æé移å¨ä¸ç¸äºä¹é´çè§åº¦ç¸çãè¿æ ·å°±è½è®©æ们以ä¸ä¸ªåå¤è¨èçååå½¢å¼æ¨¡æåºçè±ç»½æ¾çç»é¢ã
ç»è¿ä¸å®æ¶é´åï¼ç²åä¼è¿å ¥ï¼èªç±è½ä½âé¶æ®µï¼ä¹å°±æ¯ç±äºéåå ç´ å®ä»¬å¼å§å è½å°å°é¢ï¼ä»¿è¥ç»½æ¾åççççè±ã
åºæ¬ç¥è¯ï¼ç¨PythonåTkinter设计çè±ã
è¿éä¸åä¸è¡èææ°å¦ç¥è¯å ¨ä¸¢åºæ¥ï¼æ们边å代ç 边说ç论ãé¦å ï¼ç¡®ä¿ä½ å®è£ åå¯¼å ¥äºTkinterï¼å®æ¯Pythonçæ åGUIåºï¼å¹¿æ³åºç¨äºåç§åæ ·ç项ç®åç¨åºå¼åï¼å¨Pythonä¸ä½¿ç¨Tkinterå¯ä»¥å¿«éçå建GUIåºç¨ç¨åºã
importtkinterastk
fromPILimportImage,ImageTk
fromtimeimporttime,sleep
fromrandomimportchoice,uniform,randint
frommathimportsin,cos,radians
é¤äºTkinterä¹å¤ï¼ä¸ºäºè½è®©çé¢ææ¼äº®çèæ¯ï¼æ们ä¹å¯¼å ¥PILç¨äºå¾åå¤çï¼ä»¥åå¯¼å ¥å ¶å®ä¸äºå ï¼æ¯å¦timeï¼randomåmathãå®ä»¬è½è®©æ们æ´å®¹æçæ§å¶çè±ç²åçè¿å¨è½¨è¿¹ã
Tkinteråºç¨çåºæ¬è®¾ç½®å¦ä¸ï¼
root=tk.Tk()
为äºè½åå§åTkinterï¼æä»¬å¿ é¡»å建ä¸ä¸ªTk()æ ¹é¨ä»¶ï¼rootwidgetï¼ï¼å®æ¯ä¸ä¸ªçªå£ï¼å¸¦ææ é¢æ åç±çªå£ç®¡çå¨æä¾çå ¶å®è£ 饰ç©ãè¯¥æ ¹é¨ä»¶å¿ é¡»å¨æ们åå»ºå ¶å®å°é¨ä»¶ä¹åå°±å建å®æ¯ï¼èä¸åªè½æä¸ä¸ªæ ¹é¨ä»¶ã
w=tk.Label(root,text="HelloTkinter!")
è¿ä¸è¡ä»£ç å å«äºLabelé¨ä»¶ã该Labelè°ç¨ä¸ç第ä¸ä¸ªåæ°å°±æ¯ç¶çªå£çååï¼å³æ们è¿éç¨çï¼æ ¹âãå ³é®ååæ°ï¼textâæææ¾ç¤ºçæåå 容ãä½ ä¹å¯ä»¥è°ç¨å ¶å®å°é¨ä»¶ï¼Buttonï¼Canvasççã
w.pack()
root.mainloop()
æ¥ä¸æ¥çè¿ä¸¤è¡ä»£ç å¾éè¦ãè¿éçæå æ¹æ³æ¯åè¯Tkinterè°æ´çªå£å¤§å°ä»¥éåºæç¨çå°é¨ä»¶ãçªå£ç´å°æ们è¿å ¥Tkinteräºä»¶å¾ªç¯ï¼è¢«root.mainloop()è°ç¨æ¶æä¼åºç°ãå¨æä»¬å ³éçªå£åï¼èæ¬ä¼ä¸ç´å¨åçå¨äºä»¶å¾ªç¯ã
å°çè±ç»½æ¾è½¬è¯æ代ç
ç°å¨æ们设计ä¸ä¸ªå¯¹è±¡ï¼è¡¨ç¤ºçè±äºä»¶ä¸çæ¯ä¸ªç²åãæ¯ä¸ªç²åé½ä¼æä¸äºéè¦çå±æ§ï¼æ¯é äºå®çå¤è§å移å¨ç¶åµï¼å¤§å°ï¼é¢è²ï¼ä½ç½®ï¼é度ççã
跨年çè±ä»£ç ï½ç¨Pythonéä½ ä¸åºè·¨å¹´çè±ç§å·²ç»æ¥è¿å°¾å£°äºï¼å³å°å°æ¥ï¼æ¬ææ们ç¨Pythonéä½ ä¸åºè·¨å¹´çè±ç§ã
æ们ç¨å°çPython模åå æ¬ï¼tkinterãPILãtimeãrandomãmathï¼å¦æ第ä¸æ¹æ¨¡å没æè£ çè¯ï¼pipinstallä¸ä¸å³å¯ï¼ä¸é¢çä¸ä¸ä»£ç å®ç°ã
导åº
çè±é¢è²
å®ä¹çè±ç±»
çæ¾çè±
å¯å¨
çä¸ä¸ææï¼
年跨年çè±ä»£ç å¯å¤å¶
çè±ä»£ç å¦ä¸ï¼
packagelove;
importjava.applet.Applet;
importjava.awt.Color;
importjava.awt.Graphics;
importjava.net.URL;
importjava.util.Random;
çè±
@authorenjoy
@SuppressWarnings("serial")
publicclassQextendsAppletimplementsRunnable
publicintspeed,variability,Max_Number,Max_Energy,Max_Patch,
Max_Length,G;
publicStringsound;
privateintwidth,height;
privateThreadthread=null;
privateBeaClassDemobcd[];
publicvoidinit()
inti;
this.setSize(,);
width=getSize().width-1;
height=getSize().height-1;
speed=1;//çè±ç»½æ¾çé度
variability=;
Max_Number=;//å¯ååºçè±çæ大æ°ç®
Max_Energy=width+;
Max_Patch=;//æ大çæç¹æ°
Max_Length=;//æç¹çæ大è·ç¦»
G=;//åå°é¢å¼¯æ²çå度
bcd=newBeaClassDemo[Max_Number];
for(i=0;iMax_Number;i++)
bcd[i]=newBeaClassDemo(width,height,G);
}
publicvoidstart(){
if(thread==null){
thread=newThread(this);
thread.start();
}
}
@SuppressWarnings("deprecation")
publicvoidstop(){
if(thread!=null){
thread.stop();
thread=null;
}
}
@SuppressWarnings({ "unused","static-access"})
publicvoidrun(){
inti;
intE=(int)(Math.random()*Max_Energy*3/4)+Max_Energy/4+1;
intP=(int)(Math.random()*Max_Patch*3/4)//çè±çæç¹æ°
+Max_Patch/4+1;
intL=(int)(Math.random()*Max_Length*3/4)//çè±å¯åå°åºçè·ç¦»
+Max_Length/4+1;
longS=(long)(Math.random()*);
booleansleep;
Graphicsg=getGraphics();
URLu=null;
while(true){
try{
thread.sleep(/speed);
catch(InterruptedExceptionx){
sleep=true;
for(i=0;iMax_Number;i++)
sleep=sleepbcd[i].sleep;
if(sleepMath.random()*variability){
E=(int)(Math.random()*Max_Energy*3/4)+Max_Energy/4
+1;
P=(int)(Math.random()*Max_Patch*3/4)+Max_Patch/4
+1;
L=(int)(Math.random()*Max_Length*3/4)+Max_Length/4
+1;
S=(long)(Math.random()*);
for(i=0;iMax_Number;i++){
if(bcd[i].sleepMath.random()*Max_Number*L1)
bcd[i].init(E,P,L,S);
bcd[i].start();
bcd[i].show(g);
publicvoidpaint(Graphicsg)?
g.setColor(Color.black);
g.fillRect(0,0,width+1,height+1);
classBeaClassDemo
publicbooleansleep=true;
privateintenergy,patch,length,width,height,G,Xx,Xy,Ex[],Ey[],x,
y,Red,Blue,Green,t;
privateRandomrandom;
publicBeaClassDemo(inta,intb,intg)
width=a;
height=b;
G=g;
publicvoidinit(inte,intp,intl,longseed)?
inti;
energy=e;
patch=p;
length=l;
//å建ä¸ä¸ªå¸¦ç§åçéæºæ°çæå¨
random=newRandom(seed);
Ex=newint[patch];
Ey=newint[patch];
Red=(int)(random.nextDouble()*)+;
Blue=(int)(random.nextDouble()*)+;
Green=(int)(random.nextDouble()*)+;
Xx=(int)(Math.random()*width/2)+width/4;
Xy=(int)(Math.random()*height/2)+height/4;
for(i=0;ipatch;i++){
Ex[i]=(int)(Math.random()*energy)-energy/2;
Ey[i]=(int)(Math.random()*energy*7/8)-energy/8;
publicvoidstart
t=0;
sleep=false;
publicvoidshow(Graphicsg)
if(!sleep)?
if(tlength)
inti,c;
doubles;
Colorcolor;
c=(int)(random.nextDouble()*)-+Red;
if(c=0c)
Red=c;
c=(int)(random.nextDouble()*)-+Blue;
if(c=0c)
Blue=c;
c=(int)(random.nextDouble()*)-+Green;
if(c=0c)
Green=c;
color=newColor(Red,Blue,Green);
for(i=0;ipatch;i++)
s=(double)t/;
x=(int)(Ex[i]*s);
y=(int)(Ey[i]*s-G*s*s);
g.setColor(color);
g.drawLine(Xx+x,Xy-y,Xx+x,Xy-y);
if(t=length/2)
intj;
for(j=0;j2;j++)
s=(double)((t-length/2)*2+j)/;
x=(int)(Ex[i]*s);
y=(int)(Ey[i]*s-G*s*s);
g.setColor(Color.black);
g.drawLine(Xx+x,Xy-y,Xx+x,Xy-y);
常ç¨çç¼ç¨è¯è¨ã
ç¼ç¨è¯è¨ä¸ï¼Cè¯è¨
Cè¯è¨æ¯ä¸çä¸ææµè¡ã使ç¨æ广æ³çé«çº§ç¨åºè®¾è®¡è¯è¨ä¹ä¸ãå¨æä½ç³»ç»åç³»ç»ä½¿ç¨ç¨åºä»¥åéè¦å¯¹ç¡¬ä»¶è¿è¡æä½çåºåï¼ç¨Cè¯è¨ææ¾ä¼äºå ¶å®é«çº§è¯è¨ï¼è®¸å¤å¤§ååºç¨è½¯ä»¶é½æ¯ç¨Cè¯è¨ç¼åçã
ç¼ç¨è¯è¨äº:java
Javaæ¯ä¸ç§å¯ä»¥æ°å跨平å°åºç¨è½¯ä»¶çé¢å对象çç¨åºè®¾è®¡è¯è¨ï¼æ¯ç±SunMicrosystemså ¬å¸äºå¹´5ææ¨åºçJavaç¨åºè®¾è®¡è¯è¨åJavaå¹³å°ï¼å³JavaSE,JavaEE,JavaMEï¼çæ»ç§°ã
ç¼ç¨è¯è¨ä¸:c++
C++è¿ä¸ªè¯å¨ä¸å½å¤§éçç¨åºåååä¸é常被读åâCå å âï¼è西æ¹çç¨åºåé常读åâCplusplus","CPPâãå®æ¯ä¸ç§ä½¿ç¨é常广æ³ç计ç®æºç¼ç¨è¯è¨ãC++æ¯ä¸ç§éææ°æ®ç±»åæ£æ¥çãæ¯æå¤éç¼ç¨èå¼çéç¨ç¨åºè®¾è®¡è¯è¨ã
怎么把一个text文本转换成canvas对象
js使用canvas将文字转换成图像数据base,做这个功能的原因是因为在工作中遇到想屏蔽浏览器的翻译功能,使用这个方法将文字转成了,从而实现屏蔽翻译的功能源码:
/*** js使用canvas将文字转换成图像数据base
* @param { string} text 文字内容 "abc"
* @param { string} fontsize 文字大小
* @param { function} fontcolor 文字颜色 "#"
* @param { boolean} imgBaseData 图像数据
*/
textBecomeImg: function (text,fontsize,fontcolor){
var canvas = document.createElement('canvas');
//小于字加1 小于字加2 小于字加4 小于字加6
$buHeight = 0;
if(fontsize <= ){ $buHeight = 1; }
else if(fontsize > && fontsize <= ){ $buHeight = 2;}
else if(fontsize > && fontsize <= ){ $buHeight = 4;}
else if(fontsize > && fontsize <= ){ $buHeight = 6;}
else if(fontsize > ){ $buHeight = ;}
//对于g j 等有时会有遮挡,这里增加一些高度
canvas.height=fontsize + $buHeight ;
var context = canvas.getContext('2d');
// 擦除(0,九阶反转源码0)位置大小为x的矩形,擦除的意思是把该区域变为透明
context.clearRect(0, 0, canvas.width, canvas.height);
context.fillStyle = fontcolor;
context.font=fontsize+"px Arial";
//top(顶部对齐) hanging(悬挂) middle(中间对齐) bottom(底部对齐) alphabetic是默认值
context.textBaseline = 'middle';
context.fillText(text,0,fontsize/2)
//如果在这里直接设置宽度和高度会造成内容丢失 , 暂时未找到原因 , 可以用以下方案临时解决
//canvas.width = context.measureText(text).width;
//方案一:可以先复制内容 然后设置宽度 最后再黏贴
//方案二:创建新的canvas,把旧的canvas内容黏贴过去
//方案三: 上边设置完宽度后,再设置一遍文字
//方案一: 这个经过测试有问题,字体变大后,显示不全,原因是canvas默认的宽度不够,
//如果一开始就给canvas一个很大的宽度的话,这个是可以的。
//var imgData = context.getImageData(0,0,canvas.width,canvas.height); //这里先复制原来的canvas里的内容
//canvas.width = context.measureText(text).width; //然后设置宽和高
//context.putImageData(imgData,0,0); //最后黏贴复制的内容
//方案三:改变大小后,重新设置一次文字
canvas.width = context.measureText(text).width;
context.fillStyle = fontcolor;
context.font=fontsize+"px Arial";
context.textBaseline = 'middle';
context.fillText(text,0,fontsize/2)
var dataUrl = canvas.toDataURL('image/png');//注意这里背景透明的话,需要使用png
return dataUrl;
}
Vue3 + Three.js + antvG2 实战智慧城市
本文旨在为有兴趣学习 Three.js 的开发者提供一个免费的实践指南,具体实作了一个基于 Vue3、Vite、TypeScript、Three.js 和 antv G2 的智慧城市项目 demo。由于模型资源的限制,部分细节可能不够精细或美观,绝对低点公式源码请谅解。
项目技术栈包括 Vue3、Vite、TypeScript、Three.js、antv G2,所有源码公开,供学习使用。
以下是开发流程概览:
1. **初始化**:引入 Three.js,初始化场景、相机、渲染器、光线、轨道控制器,并打印以确认环境设置。
2. **搭建场景**:加载模型和天空盒子,展示基本场景。
3. **文字显示**:使用 canvas 写入文字,转为,作为纹理导入 Three.js,实现文字显示。
4. **交互设计**:通过监听鼠标事件,实现点击触发文字事件。
5. **动态效果**:制作动态光圈,通过动画方法控制几何体(光圈)的移动。
6. **图表与样式**:整合图表和页面样式,搭建最终界面。
为了实现这些功能,推荐在项目结构中创建相应的文件夹和组件,并确保资源(如)位于适当的位置。
最终,本项目提供了一个从基础到进阶的 Three.js 实践案例,适合前端开发者深入了解 3D 技术在 Web 开发中的应用。
项目源码链接:[项目源码链接]
从零开始学G6
本文旨在帮助读者从零开始理解G6,一个强大的图可视化引擎。通过阅读,你将对G6的功能分布、主要流程有基本的认识,而不涉及具体API的使用。
G6是antv体系中的图形库,专长于关系图的绘制。它是一个开源的JavaScript库,支持PC、移动端和小程序等平台,通过G提供渲染能力,G是一款强大的跨平台渲染引擎,支持canvas和svg。
工程结构方面,G6采用monorepo管理模式,使用lerna管理子项目。构建G6,只需运行`npm install`和`npm run bootstrap`。其功能分布清晰,官方v4框架图展示了基础功能的布局。
核心流程包括创建graph实例,初始化必要的单例,构建Group树结构,然后交给G进行渲染。G6的绘制流程涉及节点数据的输入、处理和渲染。节点的组织则是通过itemController创建Item实例来实现的。
除了绘制,G6还支持交互、事件、状态管理、动画和布局等功能。事件处理有清晰的分类,包括canvas、节点和时机相关事件。动画是利用G的内置能力,布局则使用来自外部npm包的算法。
总结起来,G6的功能层次分明,每个功能都有其特定的职责和执行流程。通过本文的梳理,你应该对G6的整体架构和工作原理有了更深入的理解。如果你对源码感兴趣,可以进一步探索。最后,想了解更多动态,可以关注微信公众号Eval Studio。