精华内容
下载资源
问答
  • webgl画一个3d组合图形

    2020-12-09 22:08:46
    正常来说,人们学习新东西都会从已有的知识出发,对于3D编程,在屏幕上画出3D图形,如果有2D图形API使用的基础,就会想着从2D编程的经验出发。
  • 在大学数学学科中线性代数是最为抽象的一门课从初等数学到线性代数思维跨度比微积分和概率统计要大得多大多数小伙伴学过以后一直停留在知其然不知其所以然的阶段若干年之后接触图形编等领域才发现线性代数的应用...
    dfffd45e9406d64b8d85d9d9473a318e.gif线性代数是什么?在大学数学学科中线性代数是最为抽象的一门课从初等数学到线性代数思维跨度比微积分和概率统计要大得多大多数小伙伴学过以后一直停留在知其然不知其所以然的阶段若干年之后接触图形编等领域才发现线性代数的应用无处不在但又苦于不能很好地理解和掌握多数人很容易理解初等数学的各种概念函数、方程、数列一切都那么的自然但是一进入线性代数的世界就好像来到了另一个陌生的世界在各种奇怪的符号和运算里迷失了5fa5e8e7b309b1122b1fab9fd372c795.gif69996aef8d6bd874b93738b5920a0f2a.png在初接触线性代数的时候简直感觉这是一门天外飞仙的学科一个疑问在脑子里浮现出来线性代数到底是一种客观的自然规律还是人为的设计2b7cf638c78d39c4fc8512e435b1baac.png如果看到这个问题小伙伴的反应是“这还用问,数学当然是客观的自然规律了”一点儿都不觉得奇怪我也曾这样认为从中学的初等数学和初等物理一路走来很少人去怀疑一门数学学科是不是自然规律当学习微积分、概率统计时也从来没有怀疑过唯独线性代数让我产生了怀疑因为它的各种符号和运算规则太抽象 太奇怪完全对应不到生活经验线性代数引发了我去思考一门数学学科的本质2b7cf638c78d39c4fc8512e435b1baac.png其实不止是学生包括很多数学老师都不清楚线性代数到底是什么  有什么用不仅国内如此国外也是这样国内的孟岩写过《理解矩阵》国外的Sheldon Axler教授写过《线性代数应该这样学》都没有从根本上讲清楚线性代数的来龙去脉2b7cf638c78d39c4fc8512e435b1baac.png对于我自己来讲读大学的时候没有学懂线性代数反而是后来从编程的角度理解了它很多人说数学好可以帮助编程我恰好反过来了程序的理解帮助了我理解数学下面老九君就带小伙伴们做一次程序员在线性代数世界的深度历险!既然是程序员在进入线性代数的领域之前我们先考察一番程序世界请思考这样一个问题计算机有汇编、C/C++、Java、Python等通用语言还有Makefile、CSS、SQL等DSL这些语言是一种客观的自然规律还是人为的设计呢?为什么要问这样一个看起来很蠢的问题呢?它的答案显而易见对天天使用的程序语言的认识一定胜过抽象的线性代数程序语言虽然包含了内在的逻辑,但它们本质上都是人为的设计所有程序语言的共同性在于建立了一套模型定义了一套语法将每种语法映射到特定的语义程序员和语言实现者之间遵守语言契约程序员保证代码符合语言的语法编译器/解释器保证代码执行的结果符合语法相应的语义比如C++规定用new A()语法在堆上构造对象A这样写了C++就必须保证相应的执行效果在堆上分配内存并调用A的构造函数否则就是编译器违背语言契约从应用的角度,我们能不能把线性代数视为一门程序语言呢?答案是肯定的,我们可以用语言契约作为标准来试试。假设有一个图像,我们想把它旋转60度,再沿x轴方向拉伸2倍;线性代数告诉我们,“行!按我的语法构造一个矩阵,再按矩阵乘法规则去乘你们的图像,我保证结果就是你们想要的”。实际上,线性代数和SQL这样的DSL非常相似,下面来作一些类比:模型和语义:SQL是在低级语言之上建立了关系模型,核心语义是关系和关系运算;线性代数在初等数学之上建立了向量模型,核心语义是向量和线性变换语法:SQL为每种语义定义了相应的语法,如select, where, join等;线性代数也定义了向量、矩阵、矩阵乘法等语义概念相应的语法编译/解释:SQL可以被编译/解释为C语言;线性代数相关概念和运算规则可以由初等数学知识来解释实现:我们可以在MySQL、Oracle等关系数据库上进行SQL编程;我们也可以在MATLAB、Mathematica等数学软件上进行线性代数编程所以,从应用的角度看,线性代数是一种人为设计的领域特定语言(DSL),它建立了一套模型并通过符号系统完成语法和语义的映射。实际上,向量、矩阵、运算规则的语法和语义都是人为的设计,这和一门语言中的各种概念性质相同,它是一种创造,但是前提是必须满足语言契约。为什么要有线性代数?可能有人对把线性代数当成一门DSL不放心,给一个矩阵,你就把我的图形旋转了60度沿x轴拉伸了2倍,我总感觉不踏实啊,我都不知道你“底层”是怎么做!其实,这就像有的程序员用高级语言不踏实,觉得底层才是程序的本质,老是想知道这句话编译成汇编是什么样?那个操作又分配了多少内存?别人在Shell里直接敲一个wget命令就能取下一个网页,非要用C语言花几十分钟来写一堆代码才踏实。所谓底层和上层只是一种习惯性的说法,并不是谁比谁更本质。程序的编译和解释本质上是不同模型间的语义映射,通常情况下是高级语言映射为低级语言,但是完全也可以把方向反过来。Fabrice Bellard用JavaScript写了一个虚拟机,把Linux跑在JavaScript虚拟机上,这就是把机器模型往JavaScript模型上映射。建立新模型肯定依赖于现有的模型,但这是建模的手段而不是目的,任何一种新模型的目的都为了更简单地分析和解决某一类问题。线性代数在建立的时候,它的各种概念和运算规则依赖于初等数学的知识,但是一旦建立起来这层抽象模型之后,我们就应该习惯于直接利用高层次的抽象模型去分析和解决问题。说到线性代数是为了比初等数学更容易地分析和解决问题,下面我们通过一个例子来实际感受一下它的好处:给定三角形的顶点(x1, y1), (x2, y2), (x3, y3),求三角形的面积:初等数学中三角形面积最著名的计算公式是area = 1/2 * base * height 当三角形有一条边恰好在坐标轴上时我们就很容易算出它的面积。但是,假如同样一个三角形我们把坐标轴旋转一下,让它的边不在坐标轴上,怎么办?我们还能得到它的底和高吗?答案肯定是可以的,但是就明显复杂了,而且还要分很多种情况去分别讨论。相反,如果我们用线性代数知识来解决这个问题就非常轻松在线性代数中两个向量a,b的叉积(Cross Product)是一个向量,其方向与a,b垂直,其大小等于a,b构成的平行四边形的面积:我们可以把三角形的边视为向量,所以三角形的面积等于两个边向量的叉积向量的长度除以二:area = 1/2 * length(cross_product((x2 - x1, y2 - y1), (x3 - x1, y3 - y1)))注:length表示取向量长度,cross_product表示两个向量的叉积。这样一个在初等数学里面有点儿小难的问题在线性代数中瞬间搞定!可能有人会说,直接基于叉积来做,当然简单了,但是叉积本身不是也挺复杂的吗?把它展开试试看呢?是的,模型的作用就是把一部分复杂性隐藏到模型中,使得模型的使用者可以更加简单地解决问题。曾经有人质疑C++太复杂,C++之父Bjarne Stroustrup这样回答:Complexity will go somewhere: if not the language then the application code.在特定环境下,问题的复杂性是由其本质决定的,C++把一部分的复杂性纳入了语言和标准库,目的是使得应用程序更为简单当然,并非所有场合C++都使得问题更加简单,但是从原理上讲,C++的复杂性是有道理的。除了C++,Java、SQL、CSS等各种语言和框架莫不如是,想象一下,如果不使用数据库,动不动就自己去做数据存储和管理是多么复杂啊!这样我们就不难理解为什么线性代数要定义叉积这样奇怪的运算了,它和C++把很多常用的算法和容器纳入STL是同一道理。同样的,甚至小伙伴还可以在线性代数中定义自己想要的运算拿来复用。所以,数学一点儿不死板,它和程序一样是活活泼泼的,小伙伴们理解了它的来龙去脉就能驾驭自如。说到这里,我们就顺便回答一个很常见的疑惑:线性代数的点积、叉积还有矩阵运算都很奇怪,为什么要定义这些运算呢?它们的定义又为什么是这个样子呢?其实,和程序复用一样,线性代数定义点积、叉积和矩阵运算是因为它们的应用非常广,有很大的复用价值,可以作为我们分析和解决问题的基础。比如,很多问题都涉及到一个向量到另一个向量的投影或是求两个向量的夹角,那么就会考虑专门定义点积(Dot Product)这个运算:61a2e35074e4e29f533383da257d90c1.png点积概念的提出属于设计,有发挥创造的余地;一旦设计定了,具体公式就不能随意发挥了,必须符合逻辑,保证它映射到初等数学模型的正确性。这就像一门高级语言可以定义很多概念,什么高阶函数、闭包等等,但是它必须保证映射到底层实现时在执行产生的效果符合其定义的规范。线性代数好在哪里?

    上面说了,线性代数是一种高层次抽象模型,我们可以采用学习一门程序语言的方法去学习它的语法和语义,但是这一认识不只针对线性代数,它是对每一门数学学科通用的,可能有人会有疑问。

    微积分、概率论也是高层次抽象,那么线性代数这种高层次抽象的特点在哪里呢?

    这就问到了根本上,线性代数的核心:向量模型。

    我们在初等数学中学习的坐标系属于笛卡尔所提出的解析模型,这个模型很有用,但同时也有很大的缺点。

    坐标系是人为加上的虚拟参考系,但是我们要解决的问题,比如求面积,图形旋转、拉伸等应用都是和坐标系无关的,建立一个虚拟的坐标系往往无助于解决问题,刚才三角形面积的例子就是这样。

    向量模型很好地克服了解析模型的缺点,如果说解析模型代表了某种“绝对性”的世界观,那么向量模型就代表了某种“相对性”的世界观,我推荐把向量模型和解析模型看作对立的两种模型。

    向量模型中定义了向量和标量的概念。向量具有大小和方向,满足线性组合法则;标量是只有大小没有方向的量(注:标量的另一种更深刻的定义是在旋转变换下保持不变的量)。

    向量模型的优点之一是其坐标系无关性,也就是相对性,它在定义向量和运算规则的时候从一开始就抛开了坐标系的束缚,不管坐标轴怎么旋转,我都能适应,向量的线性组合、内积、叉积、线性变换等等运算全部都是坐标系无关的。

    注意,所谓坐标系无关性不是说就没有坐标系了,还是有的,刚才三角形例子的顶点就是用坐标表示的,只是在解决问题的时候不同的坐标系不会构成影响。

    用一个比喻,Java号称平台无关,不是说Java就是空中楼阁,而是说小伙伴用Java编程时底层是Linux还是Windows往往对自身没有影响。

    向量模型有什么好处呢?

    除了刚才三角形面积问题是一个例子,下面再举一个几何的例子

    给定三维坐标系中的一点(x0, y0, z0)和一个平面a*x + b*y + c*z + d = 0,求点到平面的垂直距离?

    21c5bebe663ec9169b9d509c0f9ba6c4.png

    这个问题如果是要从解析几何的角度去解决几乎复杂到没法下手,除非是平面恰好是过坐标轴的特殊情况,但是如果从向量模型考虑就很简单:

    根据平面方程,平面的法向量(Normal Vector)是v=(a, b, c),设从平面上任意一点(x, y, z)到(x0, y0, z0)的向量为w,那么通过点积dot_product(w, v)算出w到v的投影向量p,其大小就是(x0, y0, z0)到平面a*x + b*y + c*z + d = 0的垂直距离。

    这里用到了向量模型的基本概念:法向量,投影向量,点积,整个问题解决过程简洁明快。

    5fa5e8e7b309b1122b1fab9fd372c795.gif

    下面再给小伙伴们留一道相似的练习题(熟悉机器学习的朋友可能会发现这是线性代数在线性分类中的应用):

    给定n维空间中的两点(a1, a2, ... an),(b1, b2, ... bn)和一个超平面c1*x1 + c2*x2 ... + cn*xn + d = 0,请判断两点在超平面的同侧或异侧?

    离开向量,下面我们要请出线性代数的另一个主角:矩阵(Matrix)。

    线性代数定义了矩阵和向量、矩阵和矩阵的乘法,运算规则很复杂,用来做什么也不清楚,很多初学者都不能很好地理解,可以说矩阵是学好线性代数的拦路虎

    遇到复杂的东西,往往需要先避免一头陷入细节,先从整体上把握它。

    其实,从程序的角度看,无论形式多么奇怪,它无非是一种语法,语法必然对应了语义,所以理解矩阵的重点在于理解其语义。

    矩阵的语义不止一种,在不同的环境中有不同的语义,在同一环境中也可以有不同的解读,最常见的包括:

    1)表示一个线性变换;

    2)表示列向量或行向量的集合;

    3)表示子矩阵的集合。

    矩阵作为一个整体对应的是线性变换语义:用矩阵A乘以一个向量v得到w,矩阵A就代表了v到w的线性变换。

    比如,如果想要把向量v0按逆时针方向旋转60度得到v',只需要用旋转变换矩阵(Rotation Matrix)去乘v0就可以了。

    87867e8d0e46108183ef58b944ad09e3.png

    除了旋转变换,拉伸变换也是一种常见的变换,比如,我们可以通过一个拉伸矩阵把向量沿x轴拉伸2倍(请试着自己给出拉伸矩阵的形式)。

    更重要的是,矩阵乘法有一个很好的性质:满足结合率,这就意味着可以对线性变换进行叠加。

    举个例子,我们可以把“沿逆时针旋转60度”的矩阵M和“沿x轴拉伸2倍”的矩阵N相乘,得到一个新矩阵T来代表“沿逆时针旋转60度并沿x轴拉伸2倍”。

    这是不是很像我们Shell中把多个命令通过管道进行叠加呢?

    上面重点介绍了向量模型的坐标系无关性,除此之外,向量模型的另一优点是它能描述线性关系,下面我们来看一个熟悉的Fibonacci数列的例子:

    Fibonacci数列定义为:f(n) = f(n-1) + f(n-2), f(0) = 0, f(1) = 1;问题:输入n,请给出求f(n)的时间复杂度不超过O(logn)的算法。

    首先,我们构造两个向量v1=(f(n+1), f(n))和v2=(f(n+2), f(n+1)),根据Fibonacci

    数列性质,我们可以得到从v1到v2的递推变换矩阵:

    823a996dfaae82b463a7b6e82c9a81c3.png

    并进一步得到:

    2ce613071343606550719ed1c4bbe3fb.png

    这样就把线性递推问题转化为了矩阵的n次幂经典问题,在O(log n)时间复杂度内解决。除了线性递推数列,初等数学中著名的n元一次方程组问题也可以转化为矩阵和向量乘法形式更容易地解决。

    这个例子是想说明,凡是满足线性关系的系统都是向量模型的用武之地,我们往往可以把它转化为线性代数得到简洁高效的解决方案。

    总结

    本文提出了一种观点:从应用的角度,我们可以把线性代数视为一门特定领域的程序语言。线性代数在初等数学基础上建立了向量模型,定义了一套语法和语义,符合程序语言的语言契约。

    向量模型具有坐标系无关性和线性性,它是整个线性代数的核心,是解决线性空间问题的最佳模型。向量的概念、性质、关系、变换是掌握和运用线性代数的重点

    对于编程来说,学好数学是必不可少的。对于线性代数而言,用编程的方式来思考可以帮助理解。

    编辑 ∑Gemini来源:数学算法俱乐部

    文章推荐

    ☞数学家探索两个几何世界之间的镜像链接☞数学天才帕吉特:他有如电影般的人生际遇☞世界上最奇怪的数学天才,被奖励100万却拒领,宁愿过得像乞丐☞斯坦福大学教育学院院长:学习本身就是一门学问☞如果没有数学,我们如何测量☞数学的真相:物理时空的数字模型还是现实本身?90b63ae34e886176525efa6ab9d0ad7d.png
    展开全文
  • 你只需几行代码就可以打开...对于想要开始学习编程的人来说,使用快速视觉反馈进行编程非常有用。 #设置屏幕大小的常量 SCREEN_WIDTH = 600 SCREEN_HEIGHT = 600 #打开窗户。设置窗口标题和尺寸(宽度和高度) ...

    你只需几行代码就可以打开一个窗口并创建简单的图形。让我们创建一个绘制笑脸的示例,如下图所示:
    在这里插入图片描述
    ​你可以使用Arcade的绘图命令来执行此操作。请注意,你不需要知道如何使用类甚至定义函数。对于想要开始学习编程的人来说,使用快速视觉反馈进行编程非常有用。

    #设置屏幕大小的常量

    SCREEN_WIDTH = 600

    SCREEN_HEIGHT = 600

    #打开窗户。设置窗口标题和尺寸(宽度和高度)

    arcade.open_window(SCREEN_WIDTH,SCREEN_HEIGHT,“绘图示例”)

    #将背景颜色设置为白色。

    #颜色也可以(红色,绿色,蓝色)格式指定

    #(红色,绿色,蓝色,alpha)格式。

    arcade.set_background_color(arcade.color.WHITE)

    #开始渲染过程。这必须在任何绘图命令之前完成。

    arcade.start_render()

    #画脸

    X = 300

    Y = 300

    半径= 200

    arcade.draw_circle_filled(X,Y,半径,arcade.color.YELLOW)

    #画右眼

    X = 370

    Y = 350

    半径= 20

    arcade.draw_circle_filled(X,Y,半径,arcade.color.BLACK)

    #画左眼

    X = 230

    Y = 350

    半径= 20

    arcade.draw_circle_filled(X,Y,半径,arcade.color.BLACK)

    #画出笑容

    X = 300

    Y = 280

    宽度= 120

    高度= 100

    start_angle = 190

    end_angle = 350

    arcade.draw_arc_outline(X,Y,宽度,高度,arcade.color.BLACK,start_angle,end_angle,10)

    #完成绘图并显示结果

    arcade.finish_render()

    #保持窗口打开,直到用户点击“关闭”按钮

    arcade.run()

    当然,在全局上下文中编写代码并不是一种好的形式。值得庆幸的是,使用函数改进程序非常简单。在这里,我们可以看到使用函数在特定(x,y)位置绘制松树的示例:

    DEF draw_pine_tree(X,Y):

    msgstr“”“此函数在指定位置绘制一棵松树。”“

    #在行李箱顶部画三角形。

    #我们需要三个x,y点作为三角形。

    arcade.draw_triangle_filled(x + 40,y,#Point 1

    x,y - 100,#Point 2

    x + 80,y - 100,#Point 3

    arcade.color.DARK_GREEN)

    #画树干

    arcade.draw_lrtb_rectangle_filled(x + 30,x + 50,y - 100,y - 140,

    arcade.color.DARK_BROWN)

    在这里插入图片描述

    在这里插入图片描述

    小编这边为大家准备了几个小游戏源代码,方便大家去练习

    如何获源码?

    可看图片

    展开全文
  • 掉落 开源硬件库-开放图数据库中的技术文档。 可通过 介绍 tl; dr (半)OSH模块的自动结构化:ICT基础设施... 有一个有趣的信息,可以从这样的数据库中导出(也有关职业安全与卫生模块之间的兼容性)。 对于1.0版,
  • 但是都有一个共同的特点,就是采用命令行的方式来部署,先是建立SOLC的编译环境,然后部署Geth或者Eth节点,然后一步一步生成钱包、ABI、合约地址进行部署,对初学者来说晦涩难懂而且容易失败,本文主要介绍如何在...

    网络上不少部署智能合约的文章,但是都有一个共同的特点,就是采用命令行的方式来部署,先是建立SOLC的编译环境,然后部署Geth或者Eth节点,然后一步一步生成钱包、ABI、合约地址进行部署,对初学者来说晦涩难懂而且容易失败,本文主要介绍如何在图形化界面下一键部署和调用智能合约。对于其他区块链知识,请参考我的其他文章:http://blog.csdn.net/sportshark

    一、       智能合约和DAPP概述

    1、  智能合约基本概念

            智能合约是一段代码和数据的集合,可以部署以太坊网络上运行。如果做比喻的话智能合约更像是JAVA程序,JAVA程序通过JAVA虚拟机(JVM)将代码解释字节进行执行,以太坊的智能合约通过以太坊虚拟机(EVM)解释成字节码进行执行,如果你学过汇编,会发现编译后的字节码和汇编很类似。同时智能合约有自己的账户,在时间或事件的驱动下能自动执行一些功能,如可以在相互之间传递信息,修改区块链的状态比如账户信息等。以太坊的智能合约最大的特点是图灵完备,通俗来说可以完全模拟一台计算机所能做的所有事情,大家熟知的比特币其实也可以执行一些简单脚本,但是他就不是图灵完备,比如循环指令比特币就无法执行。

    以太坊虚拟机(EVM)

            以太坊虚拟机(EVM)是以太坊中智能合约的运行环境。它不仅被沙箱封装起来,事实上它被完全隔离运行,也就是说运行在EVM内部的代码不能接触到网络、文件系统或者其它进程,甚至智能合约之间也只有有限的调用。

    2、  DAPP基本概念

            初学者经常把智能合约和DAPP搞混,以太坊社区把基于智能合约的应用称为去中心化的应用程序(Decentralized App)。DApp的目标是让你的智能合约有一个友好的界面,外加一些额外的有利于用户使用的东西。典型的DApp例子由一个html界面,web3运行库,一段JS代码以及部署在区块链上的一段智能合约组成。与一般CS架构的网站不同,DApp不能在普通的服务器上运行,DApp必须运行在一台能与以太坊节点交互的服务器上,或者任意一个以太坊节点上。DApp通过提交交易到区块链网络与对应的智能合约进行交互,并且从区块链网络而不是中心化数据库比如(MYSQL数据库)读取重要数据。相对于典型的BS架构用户登录系统不同,以太坊用户被表示成一个十六进制的地址而且所有用户数据和其他数据均保存在本地,与目前的web应用架构有很多不同。

    3、  智能合约高级语言

            用户不可能直接编写以太坊虚拟机(EVM)字节码,所以以太坊提供了几种编写智能合约的高级语言。

    Solidity:类似JavaScript,这是以太坊推荐的旗舰语言,也是最流行的智能合约语言。具体用法参加Solidity文档,地址:https://solidity.readthedocs.io/en/latest/

    Serpent:类似Python风格,文档地址:https://github.com/ethereum/wiki/wiki/Serpent

    LLL:类似Lisp风格,目前已经被终止了。

    可以根据不同的习惯选择不同的高级语言,目前最流行的是Solidity。

    二、       在以太坊私有链上部署第一个智能合约

            本文的智能合约采用以太坊官方的示例合约,功能就是在区块链上存储一个数字,并能够读取出来。代码如下:

    contract SimpleStorage {

        uint storedData;

        function set(uint x) {

            storedData = x;

        }

        function get() constant returns (uintretVal) {

            return storedData;

        }

    }

            即使没有学过Solidity语言也可以大致看出,该合约set函数存储一个数字在X变量中,get函数从X变量中读取这个数字出来,下面对这个合约进行部署:

    1、  启动私有链

            启动以太坊私有链Geth和Ethereum-Wallet图形界面(本文使用Geth 1.41版本, Ethereum-Wallet 0.8.1版本)。如果不知道如何启动,请参考我上一篇文章《区块链开发(一)搭建基于以太坊的私有链环境》地址:http://blog.csdn.net/sportshark/article/details/51855007,启动后界面如下, Ethereum-Wallet会显示红色的PRIVTE-NET标记。


    2、创建两个钱包

            点击”ADD ACCOUNT” 按钮,添加一个钱包,程序会弹出一个对话框,提示输入两遍密码,输入完密码后,账号即创建成功。创建其他的账号,一样的操作,从上面的截图可以看到,有三个账号,一个是MAIN ACCOUNT,一个是ACCOUNT2,一个是ACCOUNT3

    3、挖矿获取一些以太币

            账号创建后,还没有以太币,需要在私有链上挖矿,切换到Geth界面,输入

    miner.start(1)

            miner命令括号中的1表示用一个线程进行挖矿,如果不配置,就会让CPU全速运行,影响计算机的使用。

             运行一会后,主账号就会获取很多以太币,这个时候屏幕会快速刷屏,不用管,输入命令miner.stop()停止挖矿。

    4、  将一个钱包的以太币转到另一个钱包中

            先点击ACCOUNT2账号,进入账号详情的界面,点击右侧的“COPY address”,把ACCOUNT2的地址拷贝下来,系统会提示你现在你处在一个测试网络,不要转入真正的以太币到这个账号。

            点击钱包中“SEND”按钮,从MAINACCOUNT给ACCOUNT2转入一定以太币,同时可以看到执行这笔交易的费用是0.00042个以太币。

         

        点击发送后会提示如输入密码,但这时还没有发送成功,根据区块链的交易规则,需要矿工的确认,并且每笔交易需要确认12个块,一个块是16秒的生成时间。切换到Geth程序,输入挖矿命令,直到ACCOUNT2上显示100个以太币,然后停止挖矿。

    5、  部署智能合约

            点“CONTRACTS”,进入智能合约管理界面,点击“DEPOLY NEW CONTRACT”,开始部署智能合约,选择部署智能合约的账号,并输入智能合约的代码后,如下图

             输入完毕后点击“DEPLOY”,系统会提示输入账号密码,因为部署智能合约是需要费用的。

             

        这个时候是看不到部署的智能合约的,切换到Geth界面,进行挖矿,在12个块后,智能合约就能确认并显示出来。

    三、       运行智能合约

    1、 在本节点上运行智能合约

            点击“CONTRACTS”进入智能合约界面,可以看到刚才部署的智能合约“SimpleStorage”,点击进入该智能合约,进入详情界面,其中有智能合约写入区域和读取区域,首先启动Geth的挖矿,然后在写入区域选择相应的智能合约函数SET,在下面的数值输入框输入想设置的数值,运行一会后就可以在读取区域看到智能合约函数GET中Retval的返回值有变化。

             其他智能合约的运行也是一样,无非就是函数多点,输入多点。

     

    2、 在其他节点上运行智能合约

            此时的智能合约只能自己能看到,别人是无法看到和运行的,如果其他人要运行你部署好的智能合约需要提供一些信息,就是其他教程中所说的智能合约的ABI和地址。

    进入刚部署的“SimpleStorage”智能合约界面,右侧有四个按钮

    A.“Deposit Eher”:向该智能合约发送以太币

    B.“Copy address”:拷贝该智能合约的地址

    C.“Show QR Code”:显示一个二维码,如果用手机扫描的话,显示该智能合约的地址

    D.“Show Interface”:显示该智能合约的JSON接口,也就是ABI

            首先我们点“Copy address”,拷贝该智能合约的地址,然后点“Show Interface”将智能合约的JSON接口全部拷贝出来,在另一个需要运行智能合约的节点打开Ethereum-Wallet,打开“CONTRACTS”界面点击“WATCH CONTRACTS”添加一个智能合约。

            如上图所示,CONTRACT NAME随便填,CONTRACT ADDRESS填写智能合约地址,JSON INTERFACE填写刚才在”Show Interface “中拷贝的内容。点OK后,就可以看到这个智能合约并运行了。

    四、       智能合约的部署原理

    1、智能合约的部署架构

             本文介绍的智能合约的部署虽然是在图形化界面编译和执行,但其实最主要的是依赖于后台运行Geth的节点,此时Geth提供了一个RPC的接口向图形化界面的钱包提供区块链的信息。

    RPC接口

             Geth在8545端口提供了JSON RPC API ,数据传输采用JSON格式,可以执行Web3库的各种命令,比如向前端,比如mist等图形化客户端提供区块链的信息,默认访问地址为http://localhost:8545

            我们部署一个智能合约时,首先Ethereum-Wallet调用SOLC智能合约编译器将代码编译成成EVM字节码,然后将EVM字节码通过Geth的RPC接口发送到以太坊网络,经过全网验证后,同时写入到每个Geth管理的区块链中,架构如下


             

    2、 部署的数据流

           首先代码先经过SOLC编译变为了二进制码,然后通过一笔交易来创建智能合约,该笔交易包含了创建者账号、智能合约内容、智能合约的地址这几个关键信息,其中智能合约地址的生成是由创建者的账号和发送的交易数作为随机数输入,通过Kecca-256加密算法重新创建一个地址作为账号。


           部署过程中,需要通过交易来部署,同时数据要存储到区块链上,这些需要使用到GAS。

    交易(Transactions)

            一笔交易是一条消息,从一个账户发送到另一个账户。交易可以包含二进制数据(payload)和以太币。

            如果目标账户包含代码,该代码和输入数据会被执行。

            如果目标账户是零账户(账户地址是0),交易将创建一个新合约。正如上文所讲,这个智能合约地址不是零地址,而是由合约创建者的地址和该地址发出过的交易数量计算得到。创建合约交易的payload被当作EVM字节码执行。执行的输出做为合约代码被永久存储。这意味着,为了创建一个合约,你不需要向合约发送真正的合约代码,而是发送能够返回可执行代码的代码。

    Gas

            以太坊上的每笔交易都会被收取一定数量的gas,gas的目的是限制执行交易所需的工作量,同时为执行支付费用。当EVM执行智能合约时,gas将按照特定规则被逐渐消耗,其实GAS就是以太币的比较小的单位,如果以太币比作100元,那么GAS可以看作是1分钱。如果只有以太币,会有问题,以太币是需要大家买卖的,市场会有价格波动。可能会出现比特币这样的状况,一天跌50%涨50%。这个对计算的成本是不能接受的,例如今天做一个加法需要十块钱,明天做一个加法需要一百块钱。所以这里引入gas来解耦。把市场的波动和计算的开销来解耦,也就是说以太币和gas之间是有汇率的,以太币涨没关系,gas价格下降就可以了。它要保证我做同样的计算,消耗的法币是一致的。

            gas price(gas价格,以太币计)是由交易创建者设置的,发送账户需要预付的交易费用 = gas price * gas amount。 如果执行结束还有gas剩余,这些gas将被返还给发送账户。

            前文中曾经提到部署智能合约使用了0.00042个以太币,换算成gas就是21000gas

            无论执行到什么位置,一旦gas被耗尽(比如降为负值),将会触发一个out-of-gas异常。当前调用帧所做的所有状态修改都将被回滚。

    五、       智能合约的运行原理

            智能合约是部署在区块链的代码,区块链本身不能执行代码,代码的执行是在本地的EVM中,实际上,部署在区块链上代码是能够在本地产生原智能合约代码的代码,可以理解区块链为一个数据库,而客户端从数据库中读取了存储的运行代码,并在本地运行后,将结果写入到了区块链这个数据库中。


           本质上,以太坊的钱包也是智能合约的一个应用,以太坊搭建的是一个可供编写各种应用的平台。下一篇,将详细讲述智能合约的开发编写和调试方法

    展开全文
  • 一般的电脑都是用来玩游戏或者处理一些简单的工作的,但是对于一些特殊的行业来说,电脑就是生产力工具,高性能强运算的电脑能够更高效的完成工作,比如说:3D建模,图形视频渲染,庞大的数据运算等,台合适的电脑...

    83f6ea3c829ccf33fb333dbff22605ae.png

    如果一台卖两三万的电脑,它竟然不能流畅的玩游戏,那你一定很想知道它究竟是什么电脑?用来干什么?什么人会买?

    97809b8d9f9ccb5dc31b85941756adbb.png

    电脑是人们娱乐办公都离不开的帮手,然而在很多人看来,一般的电脑都是用来玩游戏或者处理一些简单的工作的,但是对于一些特殊的行业来说,电脑就是生产力工具,高性能强运算的电脑能够更高效的完成工作,比如说:3D建模,图形视频渲染,庞大的数据运算等,一台合适的电脑事半功倍。

    很多设计师在使用性能不足的电脑时总会力不从心,带来许多烦恼。

    4b59a698becb2562dc4581c8dd2dd86b.png

    公司的电脑越用越慢,运行效率低,还经常碰到死机和蓝屏,一天的心血就这样付之东流!陈旧的电脑急需更新换代!

    5349f33149156ce2b55bbfc216c1e9e5.png

    客户催着要方案,但是软件的加载速度实在太慢,一边是客户的电话,一边是龟速的电脑,你头疼吗。客户是不为你的电脑加载时间而等待的!

    你需要的是一个性能强大的超级图形工作站,但是一般性能强悍的图形工作站都硕大而沉重,放在家里还是公司,只能选一个,往往错过了很多的创作灵感。

    564577d98c314b437b80393f78b2018a.png

    如果是一台搭载了NVIDA Quadro P5000专业图形显卡,性能强悍,而且体型只有盒子一样大的迷你PC呢?一定可以满足很多专业设计师的需求。

    什么是Quadro显卡?

    080d7636275404fcfe7c45a367d76c6f.png

    和一般的GTX 游戏显卡不同,NVIDIA Quadro系列产品为专业工作站而设计打造,为各行各业的 200 多款专业应用程序提供处理能力。 从制造业, 科学与医学成像以及能源到媒体和娱乐, Quadro 解决方案能够实现无与伦比的性能和可靠性,是全球专业人士的图形处理器。

    315b7a7b3c38ae422fc1e90dae1e75db.png

    在最新的“帕斯卡”架构上,NVIDIA(英伟达)除了游戏消费级市场,高性能计算领域有Tesla P100外,在专业图形工作站平台也全面展开布局,并且发布了最新的NVIDIA Quadro 专业显卡,其亮点在于不仅搭载“帕斯卡”构架核心,拥有超大显存容量,而且在能耗以及技术支持方面全面升级,给迷你和移动工作站带来了更多的可能性。

    b293fb8ed35f4499b08c034ccb2d5b0e.png

    所以,近年来,拥有强大的专业图形处理性能的迷你电脑和移动笔记本也越来越多,尤其是在迷你工作站方面,更是发展迅速,一线迷你PC品牌ZOTAC索泰一口气发布了三款不同定位和不同性能的ZBOX Quadro系列迷你电脑,不仅解决了专业设计师们对于专业图形工作站电脑超强性能的需求,而且将电脑体积压缩到了普通电脑的1/10,让设计无处不在!

    索泰ZOTAC QK7P5000 为设计而生!

    e28f1a8acd8ad8c0b6276703119848c6.png

    索泰 ZBOX QK7P5000是索泰发布的三款专业迷你图形工作站中性能最强的一款。其最引以为傲的优势并非性能,反而是其体积大小,整机尺寸仅有210*203*62.2mm(长*宽*高),在搭载了Quadro专业图形显卡以及高性能CPU的同时,还保持了迷你PC小体积的独特优势。而跟传统台式PC相比,仅十分之一大小,无论公司还是家里,随时都能把图形设计带着走。

    ae1d114eabe891716efcf14c0c48892c.png

    专业图形工作站光有小巧轻盈的体量是不够的,专业的图形处理性能才是其最根本的优势。索泰 ZBOX QK7P5000搭载强劲的Intel Core i7 四核 处理器,保证了其核心处理性能。

    1aa5b7635a2d7ae614ec1dd23678a9e1.png

    而要满足专业图形设计工作,索泰 ZBOX QK7P5000中最重要的硬件NVIDIA Quadro P5000/ 16GB GDDR5专业图形卡才是其最核心的装备,专业核心流处理优化,16GB超大容量显存,让专业图形设计更高效。

    de99eeaefb2744f505ec41400f8eec9b.png

    预留的硬件接口和槽位让不同需求的设计者们随心选择,索泰 ZBOX QK7P5000设计了2个DDR4-2133/2400的内存插槽,最高可扩展至32GB。还预留了1个2.5"硬盘位,一个SATA 6.0Gbps HDD/SSD接口,以及一个M.2 SSD 插槽(PCIe x4, SATAIII自动检测),方便用随心拓展内存和硬盘容量。

    专业图形工作站到底可以干什么?

    建筑、工程与建设

    f8bfca59aabf9442e7fe576c70bc793e.png

    除了依赖 NVIDIA Quadro 专业 GPU 实现平滑设计和可视化工作流程外, AEC 公司还将转向 Quadro VR Ready 桌面和移动 GPU ,以实现身临其境的虚拟现实体验。他们还迅速采用 NVIDIA Quadro 虚拟数据中心工作站 (Quadro vDWS) 软件以加速 3D 图形;同时利用移动优势以及与虚拟桌面的远程安全协作,以提供与物理工作站相匹敌的高性能。

    媒体与娱乐

    ab328bf1353292c4777bd1dc13aec6bd.png

    Quadro提供了最可能的经验,如Adobe Creative Cloud、Avid Media Composer、Autodesk 3ds Max和Maya、Foundry NUKE等等。无论您是在实时编辑8K HDR视频,创建复杂的效果和模拟,或者动画巨大的场景和惊人数量的3D元素和纹理。
    科学和医学成像

    b5c0ee538d23190273ce7d4a6003428a.png

    Quadro拥有世界上最先进的医疗成像设备和可视化解决方案。这些同样强大的特性也使它们成为在广泛的高等教育研究应用中加速发现的理想。

    能源勘探

    d9bdf9cbff5d9219f043f62e452ac074.png

    Quadro为工程师和地球科学家提供了一种强大的新方法,可以查看更大的地震数据集,从而更精确地探测和发现更快的发现。

    内行看门道,迷你工作站无可比拟!

    08487a683a97eaa3217bc0709437eb96.png

    索泰 ZBOX QK7P5000迷你PC,或许游戏性能还不如一台价值几千元的GTX 10系列显卡游戏电脑,但是价值2万多元的索泰 ZBOX QK7P5000迷你PC在专业领域的价值却无可比拟!

    97e47b2276e00011f41ccc475882af70.png

    索泰 ZBOX QK7P5000迷你PC在catia-04、creo-01、snx-02等3D建模、三维投影等专业的图形处理测试软件中表现突出,让广大设计师们获得到Quadro系列ZBOX的轻巧高效的体验。以专业高效的图像处理,将您的工作效率提升至全新层次,留更多的时间去大胆想象,创造自己与众不同的作品!

    创意的灵感往往稍纵即逝,索泰 ZBOX QK7P5000迷你PC,以仅有台式专业图形处理电脑1/10的体积,让图形设计、影视制作、VR内容制作等不在因为沉重而体积庞大的传统台式PC而受限制,无论在公司还是在家均可以完成创意设计。

    afdcb9dfcf6a496efa80fc64610d357b.png

    让科学和数据计算,CAD渲染,3D创作,专业级视频制作,人脸 识别,VR内容创造等高效而又便捷,开启轻便设计新方式。

    展开全文
  • 下面先叙述一下问题的描述:要求设计一个能描述所有图形公共属性和方法的的类(Shape),然后设计若干个不同的继承Shape的子类,比如三角形、圆形,矩形等等,基本功能要求:能提供面积和周长的计算和输出 ...
  • CyberDuck是一个很棒的 FTP 软件,中文接口,并且支持多国语言目录显示(中文的也没有问题...更好的是,它还支持 SFTP (SSH Secure File Transfer) 协议,对于有需要一个 FTP或者 SFTP 的网站管理者来说,真是太方便了。
  • 不过这个工具只提供了一个命令行版本,对于不熟悉命令行操作的人来说,这个工具不是很方便,而且如果要将多个文件压缩合并成一个时,也会很麻烦,另外,如果输入输出都是同一个文件的话,这个工具也会有问题。...
  • java是面向对象的设计语言,当然他可以解决实际生活中的许多问题,这里笔者建议大家使用抽象...比如:对于三角形来说,计算面积要使用到底和高,对于来说要用到半径,对于矩形来说要用到宽和高等,所以,基本属性...
  • 裁剪图形ClipDrawable ClipDrawable可设置图形的裁剪幅度,它的构造函数除了指定来源图形之外,还可以指定图形的裁剪方式(从开始裁剪还是从中间裁剪还是从末尾裁剪),以及裁剪方向...对于裁剪图形来说,setLevel方法
  • 概述显卡又称为显示卡( Video card),是计算机中一个很重要的组成部分,承担输出显示图形的任务,对于喜欢玩游戏和从事专业图形设计的人来说,显卡非常重要。主流显卡的显示芯片主要由NVIDIA(英伟达)和AMD(超微...
  • 在PCB行业内,图形电镀生产夹板方式有两种...后者混夹生产时,飞巴两端夹不满的位置夹边条,电镀面积计算 (包括挡板条面积估算)对于产线员工来说有一定的困难,且容易出现偏差,同时不同料号板子线路分布不同,镀出...
  • 了解一下这三用于 Linux 上的 SSH 图形界面工具。-- Jack Wallen在你担任 Linux 管理员的职业生涯中,你会使用 Secure Shell(SSH)远程连接到 Linux 服务器或桌面。可能你曾经在某些情况...对于许多管理员来说,没...
  • 从这篇文章开始,接下来会连载系列的OpenGL相关博文,好好探讨...对于Android开发者来说,OpenGL就是用来绘制三维图形的技术手段,当然OpenGL并不仅限于展示静止的三维图形,也能用来播放运动着的三维动画。不管是三
  • 了解一下这三用于 Linux 上的 SSH 图形界面工具。在你担任 Linux 管理员的职业生涯中,你会使用 Secure Shell(SSH)远程连接到 Linux 服务器或桌面。...对于许多管理员来说,没有什么比命令行更有效了。但是...
  • 今天已经2020.8.6日了,最近也是忙着高考最后一年的冲刺,以后更新的会越来越少,但是还是努力的...值得一提的是Linux的桌面环境就是基于Qt研发的,算是比较成功的一个案例了吧! QT主要编译器版本区分 MSVC版本:这
  • 且主键对于用户来说是无意义的,为了明确这一点,我们应该让主键处于一种幽魂状态,即主键存在,但其他人并不感觉到它存在。外键:创建外键是为了在数据表之间建立联系。一个外键一般而言在他自身的主表中是唯一的,...
  • 首先,从学习的难易程度来看,Scratch和Python都是比较容易学习的编程语言,其中Scratch是“积木式”的图形化编程...对于逻辑思维能力不强的孩子来说,要想有一个更好的学习体验,应该尽量降低学习难度,从这个角度...
  • 对于Unity的开发人员来说,要保持所有开发人员的视觉完整性可能很困难。 快速浏览一下我们如何确保图形功能不会意外损坏。 (There are dozens ofplatforms you can deploy to with Unity. It can be difficult for ...
  • 线性代数是什么? 在大学数学学科中,线性代数是最为抽象的一门课,从初等数学到...的确,多数人很容易理解初等数学 的各种概念,函数、方程、数列一切都那么的自然,但是一进入线性代数的世界就好像来到了另一个陌...
  • 《Unity Shader 与 计算机图形学》第

    千次阅读 多人点赞 2016-12-28 19:50:21
    这种自底向上的架构性的东西对于图形学程序员来说可谓至关重要 我初学的时候就无时不刻在为GPU怎么参与图形运算 shader是干吗的? 管线是什么鬼? 那些牛逼闪闪的demo效果为什么的那么好?所以:这
  • 在PCB行业内,图形电镀生产...后者混夹生产时,飞巴两端夹不满的位置夹边条,电镀面积计算 (包括挡板条面积估算)对于产线员工来说有一定的困难,且容易出现偏差,同时不同料号板子线路分布不同,镀出的板子铜厚...
  • 这不仅对于普通的电影迷来说一个神秘的话题,而且对于那些还没有接触过它的世界级工程师来说也非常有吸引力。计算机图形学涉及到的话题非常广泛。从 3D 渲染到照片图像过滤器、从字体到粒子系统等许多学科都和它...
  • 虽然这些功能对于游戏来说很少用到,不过既然是一套图形引擎,那提供这些方法应该也是合理的,另外这些接口对于应用开发来说很重要。</p><p>该提问来源于开源项目:ejoy/ejoy2d</p></div>
  • 使用OGR创建弧形图形

    千次阅读 2013-06-02 13:47:02
    很多时候我们需要在矢量文件中记录一些弧形图形,由于目前OGR中没有支持通过圆心半径等方式保存矢量图形,所以对于这些矢量图形必须要计算出弧线上的点坐标进行存储,如果自己按照圆弧的算法创建这些点确实...
  • 且主键对于用户来说是无意义的,为了明确这一点,我们应该让主键处于一种幽魂状态,即主键存在,但其他人并不感觉到它存在。外键:创建外键是为了在数据表之间建立联系。一个外键一般而言在他自身的主表中是唯一的,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,585
精华内容 1,034
关键字:

对于一个图形来说