精华内容
下载资源
问答
  • 作为一个数学老师,当你需要讲向量时,需要使用一些示意图,或者需要动态地修改一下向量旋转关系。如果作为一个物理老师,也需要讲述力向量的方向和合成。如果需要现场可以动态在修改示意图时,你再采用预先绘制的...

    作为一个数学老师,当你需要讲向量时,需要使用一些示意图,或者需要动态地修改一下向量的旋转关系。如果作为一个物理老师,也需要讲述力向量的方向和合成。如果需要现场可以动态在修改示意图时,你再采用预先绘制的方式,就不会适用,这时就可以采用matplotlib来动态编程,以便课堂上动态在修改,也可以分发给学生去研究和探索更多的可能性。如果只是给一个PPT,只能看看,而不能动手,也不能更进一步研究这些问题。这样对于学生来说,印象不会很深刻,也不会培训学生动手能力。

     

    下面就来介绍一下,怎么样构造下面的旋转示意图:

    要画出这个示意图,首先要学会前面学习的辅助坐标系的表示,这样就可以表示原点所在位置,以及坐标轴的方向Xg,Yg。接着下来确定一个旋转中心C点,以C点为起点指向P1点的向量P,然后把向量P向点P2、P3、P4旋转,这里要注意的是绕着C点旋转,而不是原点。

    在这里关键点就是旋转的实现,而二维图形的旋转是一个二维矩阵的变换,它是一个线性变换,公式如下:

    因此在代码实现这个函数:

    #定义旋转矩阵
    
    def rotz(xp, yp, rz):
    
        c11 = np.cos(rz)
    
        c12 = -np.sin(rz)
    
        c21 = np.sin(rz)
    
        c22 = np.cos(rz)
    
    
    
        xpp = xp * c11 + yp * c12
    
        ypp = xp * c21 + yp * c22
    
        xg = xc + xpp
    
        yg = yc + ypp
    
    
    
        return [xg, yg]

    在这个函数先计算四个旋转量的矩阵,然后再计算出矩阵乘法之后的值,就是旋转后的位置。如果搞懂了这个,其它代码就是一些功能代码,比如画向量的箭头线段,标记点的位置,就可以显示整个示意图了。

     

    整个例子的代码如下:

    #深入浅出matplotlib-蔡军生(qq:9073204)
    #https://mysoft.blog.csdn.net/
    #2020-11-30
    
    import numpy as np
    import matplotlib.pyplot as plt
    
    plt.axis([-10, 140, 90, -10])
    
    plt.axis('on')
    plt.grid(True)
    
    #显示辅助坐标系
    plt.arrow(0,0, 40,0, head_length = 4, head_width = 2, color = 'b')
    plt.arrow(0,0, 0,40, head_length = 4, head_width = 2, color = 'b')
    plt.text(30, -2, 'Xg', color = 'b')
    plt.text(-7, 33, 'Yg', color = 'b')
    
    #
    xc = 40
    yc = 10
    
    plt.plot([xc - 30, xc + 90], [yc, yc], linewidth = 1, color = 'k') #X轴
    plt.plot([xc, xc], [yc - 5, yc + 75], linewidth = 1, color = 'k') #Y轴
    plt.scatter(xc, yc, s = 20, color = 'k')
    
    #定义旋转矩阵
    def rotz(xp, yp, rz):
        c11 = np.cos(rz)
        c12 = -np.sin(rz)
        c21 = np.sin(rz)
        c22 = np.cos(rz)
    
        xpp = xp * c11 + yp * c12
        ypp = xp * c21 + yp * c22
        xg = xc + xpp
        yg = yc + ypp
    
        return [xg, yg]
    
    #
    xp = 60
    yp = 0
    
    #P1
    rz = 0
    rz = rz * np.pi/180
    [xg, yg] = rotz(xp, yp, rz)
    plt.scatter(xg, yg, s = 30, color = 'k')
    plt.text(xg + 1, yg + 6, 'P1', color = 'k')
    
    #P2
    rz = 30
    rz = rz * np.pi/180
    [xg, yg] = rotz(xp, yp, rz)
    plt.scatter(xg, yg, s = 30, color = 'grey')
    plt.text(xg + 1, yg + 6, 'P2', color = 'grey')
    
    #P3
    rz = 60
    rz = rz * np.pi/180
    [xg, yg] = rotz(xp, yp, rz)
    plt.scatter(xg, yg, s = 30, color = 'r')
    plt.text(xg + 1, yg + 6, 'P3', color = 'r')
    
    xpp3 = xg
    ypp3 = yg
    
    #P4
    rz = 90
    rz = rz * np.pi/180
    [xg, yg] = rotz(xp, yp, rz)
    plt.scatter(xg, yg, s = 30, color = 'grey')
    plt.text(xg + 1, yg + 6, 'P4', color = 'grey')
    
    #向量标记
    plt.arrow(0, 0, xc - 4, yc - 1, head_length = 4, head_width = 2, color = 'k')
    plt.text(28, 6, r'$\mathbf{C}$', color = 'k')
    
    plt.arrow(0, 0, xpp3 - 3, ypp3 - 3, head_length = 4, head_width = 2, color = 'b')
    plt.text(45, 50, r'$\mathbf{Pg}$', color = 'b')
    
    plt.arrow(xc, yc, xpp3 - 2 - xc, ypp3 - 5 - yc, head_length = 4, head_width = 2, color = 'r')
    plt.text(61, 40, r'$\mathbf{P^{\prime}}$', color = 'r')
    
    plt.arrow(xc, yc, xp - 4, yp, head_length = 4, head_width = 2, color = 'k')
    plt.text(80, yc - 2, r'$\mathbf{P}$', color = 'k')
    
    plt.show()
    
    

    在例子里,主要四个点分别旋转30度、60度、90度的情况。

     

     

    展开全文
  • 最近了开发项目而忙碌着,...需求:点击屏幕任意位置的时候,物体中心点开始到触摸点位置结束,绘制一条线条来表示行动轨迹,物体移动到触摸位置。 效果: 一、制作界面 层级管理器的节点结构 1.root,根节点 2.t

    最近了开发项目而忙碌着,写博客的时间变少了,我也希望在多余的时间来记录下开发中遇到的问题和技术难题。游戏还在开发中就不能展现出来了,所以为了记录方便我就把功能做成一个个的小demo。

    需求:点击屏幕任意位置的时候,物体中心点开始到触摸点位置结束,绘制一条线条来表示行动轨迹,物体移动到触摸位置。

    效果:


    一、制作界面

    层级管理器的节点结构


    1.root,根节点


    2.trackLayout,轨迹


    3.trackSprite,轨迹点


    4.moveSprite,移动物体


    二、脚本

    cc.Class({
        extends: cc.Component,
    
        properties: {
            root: cc.Node,
            moveSprite: cc.Sprite,
            trackLayout: cc.Layout,
        },
    
        // use this for initialization
        onLoad: function () {
            this.startPos = cc.p(0, 0);  //开始位置
            this.endPos = cc.p(0, 0);    //结束位置
            this.trackSprites = [];      //装轨迹点
            
            //轨迹不显示
            this.trackLayout.node.active = false;
            
            //触摸结束事件
            this.node.on(cc.Node.EventType.TOUCH_END, this.onTouchEnd, this, true);
        },
        
        onTouchEnd: function (event) {
            //停止移动,为了避免没移动结束,却改变了目标位置
            this.moveSprite.node.stopAllActions();
            this.removeTrackSprites();
            //获取开始的位置
            this.startPos = this.moveSprite.node.getPosition();
            //获取点击的位置
            this.endPos = cc.p(event.getLocation().x, event.getLocation().y);
            cc.log("getLocation = ", this.endPos.x, this.endPos.y, event.getLocation().x, event.getLocation().y);
            this.spriteMoveAction();
            this.drawTrack(event.getLocation());
        },
        
        spriteMoveAction: function () {
            //获得2点之间的距离
            let distance = cc.pDistance(this.startPos, this.endPos);
            
            //计算移动需要话费的时间,时间 = 距离 / 速度
            let moveTime = distance / 400;
            
            cc.log("move = ", this.endPos.x, this.endPos.y);
            //变速移动 
            let moveTo = cc.moveTo(moveTime, this.endPos).easing(cc.easeInOut(3));
            
            //回调函数
            let callfunc = cc.callFunc(function () {
                this.trackLayout.node.active = false;
            }, this);
            
            //让sprite移动
            this.moveSprite.node.runAction(cc.sequence(moveTo, callfunc));
        },
        
        //绘制轨迹路线
        drawTrack: function (end) {
            this.trackLayout.node.active = true;
            this.trackLayout.node.setPosition(this.startPos);
            let distance = cc.pDistance(this.startPos, this.endPos);
            
            //获得轨迹点
            this.trackSprite = this.trackLayout.node.getChildByName("trackSprite");
            
            //轨迹点数量
            let trackNum = Math.floor(distance / (this.trackSprite.width + this.trackLayout.spacingX));
            
            for (i = 1; i < trackNum; i++) {
                //克隆轨迹点
                let trackSpriteTemplate = cc.instantiate(this.trackSprite);
                this.trackLayout.node.addChild(trackSpriteTemplate);
                this.trackSprites.push(trackSpriteTemplate);
            }
            
            //向量差计算,结束点-开始点,向量的指向是朝着结束点
            var posSub = this.endPos.sub(this.startPos);
            //向量的角度计算,cc.pToAngle是获得弧度值,角度 = 弧度/PI*180
            var angle = cc.pToAngle(posSub) / Math.PI * 180;
            
            //rotation 是逆时针旋转的,在角度添加负号才正确
            this.trackLayout.node.rotation = -angle;
        },
        
        //移除轨迹点
        removeTrackSprites: function () {
            for (i = 0; i < this.trackSprites.length; i++ ) {
                let trackSprite = this.trackSprites[i];
                if (trackSprite) {
                    trackSprite.removeFromParent();
                }
            }
        }
    });
    




    展开全文
  • 先放成品图如上图一所示(为了更好展示三维图,有两个面没有进行封闭),其是由图二在空间内绕特定向量(x,y,z)(并非坐标轴)旋转一定角度绘制而成,之前想在osg里找到一种绘制空间旋转体通用方法,找了很久都未曾...

     参考博客:http://blog.csdn.net/qiuchangyong/archive/2010/09/02/5859628.aspx

    图一
    图二

            先放成品图如上图一所示(为了更好展示三维图,有两个面没有进行封闭),其是由图二在空间内绕特定向量(x,y,z)(并非坐标轴)旋转一定角度绘制而成,之前想在osg里找到一种绘制空间旋转体通用方法,找了很久都未曾找到,所以在这里我是采用自己瞄点,由点及面渲染最后生成osg::Node而成的,虽然比较麻烦,但是增加了灵活性并适用于更多的场景下的需求,下面贴出自己的绘制过程,如有更简单方法烦请诸位告知。

            绘制空间扇形旋转几何体首先从基础图元着手,首先采用基础函数绘制出一个平面扇形,函数及入参说明如下所示,弧长分段数参数表示你打算扇形弧边分为多少段进行绘制,段数越多弧显得更圆润,当然计算随之变大,这个数值自己取舍,一般绘制整圆采用72个点,我这里使用了16个点。

    /* fn MakeSectorVer
     *	coords  存放点集
     *  rad     半径
     *  arc     扇形圆心角
     *  count   弧长分段数
     *  head    偏转角
     */
    void MakeSectorVer(osg::ref_ptr<osg::Vec3Array> &coords, double rad, double arc, double count, double head)
    {
    	arc = arc / 180 * PI;
    	head = head / 180 * PI;
    	double degree = 0;
    	for (int i = 0; i < count; i++)
    	{
    		coords->push_back(osg::Vec3(rad * cos(head + degree), rad * sin(head + degree), 0.0));
    		degree += arc / count;
    	}
    }

     

           有了基础扇形就是对刚才绘制的Coords点集随着旋转轴一起旋转即可,基本思路如上图所示(画的比较粗糙), 在这个地方我是将XOY平面内扇形以Y轴为旋转轴进行旋转α度所得,当然你可以选择任意向量为轴都可以,但是代入计算时候务必是单位向量,其实旋转这种基本图元最难的地方的是侧面的渲染,在这里我是将α分为count(上面入参)份进行旋转,得到coords内所有点向下旋转的又一个点集,然后再进行渲染绘制,也就是coords内每个点进行旋转再得到count个点集数组,可能比较难以理解,这需要一定空间想象能力,下面为主要代码

    /* fn CreateOneTri
     *	rotaxia     旋转轴
     *  line        存放点集
     *  point       目标旋转点
     *  sidearc     旋转角
     *  count       数量
     */
    void CreateOneTri(osg::Vec3 &rotaxis, osg::ref_ptr<osg::Vec3Array> &line, osg::Vec3 &point, double sidearc, int count)
    {
    	double degree = 0;
    	sidearc = sidearc / 180 * PI;
    	for (int i = 0; i < count; i++)
    	{
    		double c = cos(degree);
    		double s = sin(degree);
    		double x = (pow(rotaxis.x(), 2) * (1 - c) + c) * point.x() + (rotaxis.x()*rotaxis.y() * (1 - c) - rotaxis.z()*s)*point.y() + (rotaxis.x()*rotaxis.z() * (1 - c) + rotaxis.y() * s) * point.z();
    		double y = (rotaxis.x()*rotaxis.y() * (1 - c) + rotaxis.z()*s)*point.x() + (pow(rotaxis.y(), 2) * (1 - c) + c) * point.y() + (rotaxis.y()*rotaxis.z()*(1 - c) - rotaxis.x()*s)*point.z();
    		double z = (rotaxis.x()*rotaxis.z()*(1 - c) - rotaxis.y()*s)*point.x() + (rotaxis.y()*rotaxis.z()*(1 - c) + rotaxis.x()*s)*point.y() + (pow(rotaxis.z(), 2) * (1 - c) + c)*point.z();
    		line->push_back(osg::Vec3(x, y, z));
    		degree += sidearc / count;
    	}
    }

           最后就是点的组合渲染,我这里采用的是QUAD的方式连接渲染,在网上有很多的源码,这里我就不贴出来了,最核心的部分已经贴出来,自我感觉这种三维编程还是需要自己动手写才会有更多的领悟,DEMO地址后续再贴出来。

    完整Demo链接:https://download.csdn.net/download/qq_41303159/12412870

    展开全文
  • //旋转向量 GLfloat AngleY; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); //这个函数其实就是对接下来要做什么进行一下声明 GL_MODELVIEW 模型视图...
  • 点这里 在线效果演示:http://raphaeljs.com/pie.html http://raphaeljs.com github:https://github.com/DmitryBaranovskiy/raphael 转载于:https://www.cnblogs.com/RTdo/p/4396557.html

    点这里

    在线效果演示:http://raphaeljs.com/pie.html

    http://raphaeljs.com

     github: https://github.com/DmitryBaranovskiy/raphael

    转载于:https://www.cnblogs.com/RTdo/p/4396557.html

    展开全文
  • 还是在读书的时候帮外专业朋友做作业,用GDI实现三维空间的立方体绘制旋转的操作,那个时候自己根据《线性代数与空间解析几何》以及《计算机图形学》等课程的相关知识写了一个三维向量类。后来做了些二维和三维的...
  • OpenGL绘制立方体

    2020-04-12 22:04:20
    OpenGL绘制立方体 前言 本教程需要一定的数学基础(懂得向量,矩阵算法),以及需要一定的OpenGL绘图基础。...三维向量旋转 首先定义向量(xyzw)\left(\begin{matrix} \color{red}x \\\color{green}y \\\color{blue}z ...
  • 变换:向量和矩阵

    2016-11-21 12:20:14
    主要使用了: 矩阵构造(平移、旋转、综合变换) ...示例程序绘制了一个在屏幕中间旋转的线框花托。 // ModelviewProjection.cpp // OpenGL SuperBible // Demonstrates OpenGL the ModelviewProjec...
  • 向量空间的几何变换

    2007-07-19 22:00:00
    包括平移,旋转变换,这是一个很基本的东西,即把向量扩维到一个能够变换的空间中,例如变换三维的颜色向量,将它扩展为五维空间。在我做的项目中,很多图形本身只有一组变换参数和一个指向图元的引用,那么绘制这些...
  • 我试图从一个点绘制一条速度矢量线。画这条线并不难:只要插入一条有长度的线velocity.length在图表中。这将使线以Y轴方向的点为中心。我们现在需要在适当的旋转和平移中得到它。平动矢量不难计算:它是速度矢量的一半...
  • 将圆上的点移动到圆心坐标后,绕法向量旋转,生成一圈点列。然后再将点列移动到圆心所在位置。 使用完成绘制 ax.plot_trisurf(v_buff[0], v_buff[1], v_buff[2], linewidth=0.2, antialiased=True, alpha=0.5) 上面...
  • 首先需要创建两个着色器程序,一个不适应几何着色器正常绘制物体,另一个通过几何着色器生成法线向量,然后输出直线(法线向量)。 顶点着色器 在顶点着色器中可以得到模型每个顶点的法线向量,为了适配模型缩放和...
  • Raphaël.js 是一个小型的 JavaScript 库,用来简化在页面上显示向量图的工作。你可以用它在页面上绘制各种图表、并进行图片的剪切、旋转等操作。 Raphaël.js 使用SVG W3C推荐标准和VML作为创建图形的基础。
  • 我已经能够在屏幕上绘制多边形,并且我想在多边形坐标上手动应用旋转矩阵(旋转是围绕用户的lookAt点进行的)。我已经做了什么为了旋转世界,用户首先在屏幕上单击,然后在周围拖动鼠标以执行旋转。让我们将第一个单击...
  • 3D图形的绘制和操作

    2012-09-20 16:29:10
    3D 图形的绘制和操作   前段时间一直在做3D图形的绘制,最初打算用OpenGL,但是项目很...(2)3D立方体的操作,平移操作,旋转操作(鼠标操作,并不是单一的围绕X、Y、Z向量旋转)。   大家有需要的可以密我QQ
  • OpenGL-绘制更多的3D物体

    千次阅读 2019-04-17 09:31:01
    使用for循环进行10个立方体的绘制,令每个立方体旋转角度不同,来达到更好的视觉效果。 举个栗子 相对于上篇文章,我们仅修改了main.cpp,按照思路进行修改,但去除了立方体的旋转 代码 main.cpp //头文件 #...
  • Unity绘制圆半径内随机点

    千次阅读 2017-11-25 22:34:45
    实现原理:先给随机的长度并取单位向量,然后旋转随机的角度,即可生成达成命题,绘制圆半径内随机点(这是博主帮人机试时突然闪现出的解决方案,哈哈哈!简直完美!!!老夫聊发少年狂,左牵黄右......) 实际效果如下: ...
  • 平移,旋转,位似

    2021-05-16 12:25:30
    主题:平移,旋转,位似 一. 点动平移 主要思想:首先画一个点A,其次输入一个向量u,并使用滑杆设置设置一个动态向量v,最后对点A进行平移。命令如下: A = (-2, -1) u = (1, 3) 滑杆:a = 0.4 v=a*u 平移(A, v) 二. ...
  • PCoA)是一种研究数据相似性或差异性的可视化方法,把复杂的数据用一系列的特征值和特征向量进行排序后,选择排在前面的几位特征值,用来表示样品之间的关系并以坐标的形式展现,结果是数据矩阵的旋转,通过PCA 可以...
  • 然后以绘制基点为初始位置,依次叠加旋转后的基向量;最终将Pareto最优解以一条独立路径映射为二维空间平面上的一条折线,得到旋转基可视化图形.基于此思想设计了高维多目标可视化模型并进行实验,结果表明,该技术有效地...
  • 绘制恒星行星卫星三星系统

    千次阅读 2016-04-26 21:57:20
    这次的博客略微有点偷懒了,主要利用上次博客的成果略微加了一点点东西形成的,因为网上流传着一份三星系统,我这次就是先制作了一个两星...插一句,其实利用这个和之前的旋转,略微控制下旋转的速度就可以制作出三星系
  • Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供、坐标转换、颜色管理以及文字布局等更精确的控制。绘图属性Graphics2D定义了几...
  • 看到这个问题的时候,第一想法是计算两点的距离、角度,通过旋转角度来解决这个问题。 但是后来才发现可以用向量来解决。 private Transform _parentTran; private GameObject _line; private void Start() {...
  • 下图演示了如何给一条线段画上箭头的实现原理,主要也就是如何旋转一个向量。 其中rotation angle和scale都可以在程序代码中自定义。
  • PCoA分析,即主坐标分析(principal co-ordinates ...PCoA分析,首先对一系列的特征值和特征向量进行排序,然后选择排在前几位的最主要特征值,并将其表现在坐标系里,结果相当于是距离矩阵的一个旋转,它没有...
  • 第五章 二维图形变换5.1 向量基础向量功能图形学中,处理三维物体,以及绘制对象的形状、位置、方向。有两大基本工具:向量分析、图形变换。向量:点和方向的实体 (没有位置)向量的表示两点之差是一个向量,方向指向...
  • 绘制点物标 名称: SY – Showpoint,显示符号命令。 句法: SY(SYMBOL [,ROT]); 描述: SY命令在显示屏上的给定点显示符号。该命令将标准符号名称作为其第一个必需参数。第二个参数可以使符号绕枢...
  • 下图所用的参数;  椭圆标准情况下参数方程用 ( 5 cos(t), 3 sin(t) ) ...对参数方程形式的向量旋转和平移,然后对y坐标求极大值可以得到,极大值点对应的坐标: 从而可以用Geogebra绘制动态演示图片如下:

空空如也

空空如也

1 2 3 4 5 6
收藏数 104
精华内容 41
关键字:

绘制旋转向量