精华内容
下载资源
问答
  • 2021-12-10 19:50:00

            旋转是一种常见的运动,它同样有位移,速度和加速度,指责写概念都想和旋转的角度有关,将上述这些与角度相关的运动用角运动来定义

    注:1 rpm/s(1转/s) = 2π/s

    待补充。。。

    参考数学和物理游戏开发入门   主编 徐芝琦

    更多相关内容
  • 这次使用的还是字体,主要是字体这个比较通用,颜色,大小都可以自己定义。当然了,来的最快的其实是用图片代替。 二、微信小程序中评分功能实现 1.css文件中引入字体文件。也可以点此下载字体 @font-face { font-...

    一、前言

    项目中遇到的评分相关的需求其实还挺多。之前也写过网页中关于评分功能实现的文档。这次,是基于微信小程序开发而提炼出一个简单方便使用的方法,网页开发中同样可用。这次使用的还是字体,主要是字体这个比较通用,颜色,大小都可以自己定义。当然了,来的最快的其实是用图片代替。

    二、微信小程序中评分功能实现

    1.css文件中引入字体文件。也可以点此下载字体

    @font-face {  
      font-family: 'FontAwesome';  
      src: url('https://netdna.bootstrapcdn.com/font-awesome/3.2.1/font/fontawesome-webfont.woff?v=3.2.1') format('woff'); 
    }
    

    2.根据自己项目的需求写出五角星的样式。参考下面

    .star{margin-right:10rpx;}/*五角星之间的间距*/
    /*五角星*/
    .star .icon:before {content: '\f005'; font-family: FontAwesome; position: absolute;left: 0;top: 0;display: block;  overflow: hidden;}
    .star .icon {display: block; font-size: 21px; text-align: center; width: 38rpx;height: 56rpx;line-height: 56rpx;position: relative;white-space: pre;}
    /*灰色五角星*/
    .star .icon_gray{color:#aaa}
    /*黄色五角星*/
    .star .icon_yellow:before {color: #F63;}
    

    三、静态实现五角星评分

    1.如果是静态实现,可以直接设置宽度来实现评分效果,直接定义需要变色的五角形的比例。如果是颗星可以直接定义伪类元素宽度是50%;如果是1/3颗星可以定义宽度是33%;同样的,如果是2/3颗星星,直接定义宽度为66%。如下:

    /*自定义长度的黄色五角星*/
    .half_star .icon_yellow:before {width: 50%;} 
    

    2.html的代码如下

     <view >
            <view style="font-size:12px;color:#aaa;text-align:center;margin-top:5px;">静态评价星级</view>
            <view style="font-size:32px;color:#f63;text-align:center;margin-top:5px;">4.50</view>
            <view style="width:105px;margin:0 auto">
                <view style="display:flex;">        
                    <view class="star"><view class="icon icon_yellow"></view></view>
                    <view class="star"><view class="icon icon_yellow"></view></view>
                    <view class="star"><view class="icon icon_yellow"></view></view>
                    <view class="star"><view class="icon icon_yellow"></view></view>
                    <view class="star half_star"><view class="icon icon_gray"><view class="icon icon_yellow"></view></view></view>
                </view>        
            </view>                 
        </view>  
    

    3.实现效果如下图
    静态展示五角星评分
    四、动态实现评价打分效果

    1.样式同(二、微信小程序中评分功能实现)上。只是定义宽度的地方是动态赋值的。
    2.定义需要展示的初始属性值。分别是要展示的黄色五角星,灰色五角星,以及那颗需要打分的的黄色五角星。

    Page({
      /**
       * 页面的初始数据
       */
      data: {    
        yellow_star:0,//黄色五角星,默认一开始是黄色星星0分
        gray_star:5,//灰色五角星 灰色星星是5颗 表示是5分
        star_per:0,//自定义长度黄色五角星  一开始需要打的是0分
      }
    })
    

    3.根据返回的结果改变初始化的数据 ,比如,后台返回的评分是3.62

    var star="3.62";//后台获取的评分
    var yellow_star=parseInt(star);//需要展示的整个黄色5角星,3.62分的时候需要展示3颗整个的黄色五角星。
    var star_per=parseFloat(star-yellow_star)*100;//3.62颗评价分-3颗整个黄色星,是0.62的占比,先将它*100。这样赋值的时候比较方便。也就是一颗灰色的星星中展示出62%的黄色部位。
    var gray_star=parseInt(5-star);//需要展示的灰色星星,正常是5-3.62=1.38颗,0.38颗已经是在百分比中了。所以此时最后需要展示的是1整个灰色五角星
    this.setData({    
        star:star,  //评分数       
        yellow_star:yellow_star,//整个黄色五角星的个数
        star_per:star_per,//一颗灰色五角星中黄色五角星的占比
        gray_star:gray_star,//整个灰色五角星的数量
    })
    

    4.最后一步就是页面中如何渲染的问题了。由于微信小程序中无法实现动态修改伪类元素的样式值【可能是我不会,会的同学可以指点一下】,所以,那颗占百分比的黄色五角星,我用的是底部一个灰色五角星+覆盖一个黄色五角星,都是用的绝对定位,最后黄色五角星用的是width+overflow:hidden 把多余的部位隐藏了。

    <view>
            <view style="font-size:12px;color:#aaa;text-align:center;margin-top:5px;">动态评价星级</view>
            <view style="font-size:32px;color:#f63;text-align:center;margin-top:5px;">{{star}}</view>
            <view style="width:105px;margin:0 auto">
                <view style="display:flex;">            
                    <view class="star" wx:for="{{yellow_star}}"><view class="icon icon_yellow"></view></view>
                    <view wx:if="{{star_per>0}}" class="star" style="position:relative;">            
                    	<view class="icon icon_gray"></view>            
                    	<view class="icon icon_yellow "style="width:{{star_per}}%;overflow:hidden;position:absolute;left:0;top:0;"></view>          
                    </view>
                    <view class="star" wx:for="{{gray_star}}"><view class="icon icon_gray"></view></view>
                </view>     
            </view>            
    </view>
    

    5.实现效果图如下:
    动态实现五角星展示
    五、总结

    这个效果的实现无非就三点。第一点引用字体。第二点比较重要,就是如何用css画出想要的五角星,至于动态实现那块其实一点也不难,思路清晰了,自然就水到渠成了。如果觉得有不妥的地方还望赐教。觉得有更好的方法也可以分享一下哦。

    展开全文
  • 由于我们的目的是从左上到右下一共有多少种路径,那我们就定义 dp[i] [j]的含义为: 当机器人从左上走到(i, j) 这个位置时,一共有 dp[i] [j] 种路径 。那么,dp[m-1] [n-1] 就是我们要的答案了。 注意,这个...

    对于动态规划,春招秋招时好多题都会用到动态规划,一气之下,再 leetcode 连续刷了几十道动态规划的题

    640?wx_fmt=png
    在这里插入图片描述

    之后,豁然开朗 ,感觉动态规划也不是很难,今天,我就来跟大家讲一讲,我是怎么做动态规划的题的,以及从中学到的一些套路。相信你看完一定有所收获

    如果你对动态规划感兴趣,或者你看的懂动态规划,但却不知道怎么下手,那么我建议你好好看以下,这篇文章的写法,和之前那篇讲递归的写法,是差不多一样的,将会举大量的例子。如果一次性看不完,建议收藏,同时别忘了素质三连

    为了兼顾初学者,我会从最简单的题讲起,后面会越来越难,最后面还会讲解,该如何优化。因为 80% 的动规都是可以进行优化的。不过我得说,如果你连动态规划是什么都没听过,可能这篇文章你也会压力山大。

    一、动态规划的三大步骤

    动态规划,无非就是利用历史记录,来避免我们的重复计算。而这些历史记录,我们得需要一些变量来保存,一般是用一维数组或者二维数组来保存。下面我们先来讲下做动态规划题很重要的三个步骤,

    如果你听不懂,也没关系,下面会有很多例题讲解,估计你就懂了。之所以不配合例题来讲这些步骤,也是为了怕你们脑袋乱了

    第一步骤:定义数组元素的含义,上面说了,我们会用一个数组,来保存历史数组,假设用一维数组 dp[] 吧。这个时候有一个非常非常重要的点,就是规定你这个数组元素的含义,例如你的 dp[i] 是代表什么意思?

    第二步骤:找出数组元素之间的关系式,我觉得动态规划,还是有一点类似于我们高中学习时的归纳法的,当我们要计算 dp[n] 时,是可以利用 dp[n-1],dp[n-2]…..dp[1],来推出 dp[n] 的,也就是可以利用历史数据来推出新的元素值,所以我们要找出数组元素之间的关系式,例如 dp[n] = dp[n-1] + dp[n-2],这个就是他们的关系式了。而这一步,也是最难的一步,后面我会讲几种类型的题来说。

    学过动态规划的可能都经常听到最优子结构,把大的问题拆分成小的问题,说时候,最开始的时候,我是对最优子结构一梦懵逼的。估计你们也听多了,所以这一次,我将换一种形式来讲,不再是各种子问题,各种最优子结构。所以大佬可别喷我再乱讲,因为我说了,这是我自己平时做题的套路。

    第三步骤:找出初始值。学过数学归纳法的都知道,虽然我们知道了数组元素之间的关系式,例如 dp[n] = dp[n-1] + dp[n-2],我们可以通过 dp[n-1] 和 dp[n-2] 来计算 dp[n],但是,我们得知道初始值啊,例如一直推下去的话,会由 dp[3] = dp[2] + dp[1]。而 dp[2] 和 dp[1] 是不能再分解的了,所以我们必须要能够直接获得 dp[2] 和 dp[1] 的值,而这,就是所谓的初始值

    由了初始值,并且有了数组元素之间的关系式,那么我们就可以得到 dp[n] 的值了,而 dp[n] 的含义是由你来定义的,你想求什么,就定义它是什么,这样,这道题也就解出来了。

    不懂?没事,我们来看三四道例题,我讲严格按这个步骤来给大家讲解。

    更多算法原创文章,可以关注我的公众号『苦逼的码农

    二、案例详解

    案例一、简单的一维 DP

    问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

    (1)、定义数组元素的含义

    按我上面的步骤说的,首先我们来定义 dp[i] 的含义,我们的问题是要求青蛙跳上 n 级的台阶总共由多少种跳法,那我们就定义 dp[i] 的含义为:跳上一个 i 级的台阶总共有 dp[i] 种跳法。这样,如果我们能够算出 dp[n],不就是我们要求的答案吗?所以第一步定义完成。

    (2)、找出数组元素间的关系式

    我们的目的是要求 dp[n],动态规划的题,如你们经常听说的那样,就是把一个规模比较大的问题分成几个规模比较小的问题,然后由小的问题推导出大的问题。也就是说,dp[n] 的规模为 n,比它规模小的是 n-1, n-2, n-3…. 也就是说,dp[n] 一定会和 dp[n-1], dp[n-2]….存在某种关系的。我们要找出他们的关系。

    那么问题来了,怎么找?

    这个怎么找,是最核心最难的一个,我们必须回到问题本身来了,来寻找他们的关系式,dp[n] 究竟会等于什么呢?

    对于这道题,由于情况可以选择跳一级,也可以选择跳两级,所以青蛙到达第 n 级的台阶有两种方式

    一种是从第 n-1 级跳上来

    一种是从第 n-2 级跳上来

    由于我们是要算所有可能的跳法的,所以有 dp[n] = dp[n-1] + dp[n-2]。

    (3)、找出初始条件

    当 n = 1 时,dp[1] = dp[0] + dp[-1],而我们是数组是不允许下标为负数的,所以对于 dp[1],我们必须要直接给出它的数值,相当于初始值,显然,dp[1] = 1。一样,dp[0] = 0.(因为 0 个台阶,那肯定是 0 种跳法了)。于是得出初始值:

    dp[0] = 0.

    三个步骤都做出来了,那么我们就来写代码吧,代码会详细注释滴。

    int f( int n ){
        if(n <= 1)
        return n;
        // 先创建一个数组来保存历史数据
        int[] dp = new int[n+1];
        // 给出初始值
        dp[0] = 0;
        dp[1] = 1;
        // 通过关系式来计算出 dp[n]
        for(int i = 2; i <= n; i++){
            dp[i] = dp[i-1] + dp[i-2];
        }
        // 把最终结果返回
        return dp[n];
    }
    
    (4)、再说初始化

    大家先想以下,你觉得,上面的代码有没有问题?

    答是有问题的,还是错的,错在对初始值的寻找不够严谨,这也是我故意这样弄的,意在告诉你们,关于初始值的严谨性。例如对于上面的题,当 n = 2 时,dp[2] = dp[1] + dp[0] = 1。这显然是错误的,你可以模拟一下,应该是 dp[2] = 2。

    也就是说,在寻找初始值的时候,一定要注意不要找漏了,dp[2] 也算是一个初始值,不能通过公式计算得出。有人可能会说,我想不到怎么办?这个很好办,多做几道题就可以了。

    下面我再列举三道不同的例题,并且,再在未来的文章中,我也会持续按照这个步骤,给大家找几道有难度且类型不同的题。下面这几道例题,不会讲的特性详细哈。实际上 ,上面的一维数组是可以把空间优化成更小的,不过我们现在先不讲优化的事,下面的题也是,不讲优化版本。

    案例二:二维数组的 DP

    我做了几十道 DP 的算法题,可以说,80% 的题,都是要用二维数组的,所以下面的题主要以二维数组为主,当然有人可能会说,要用一维还是二维,我怎么知道?这个问题不大,接着往下看。

    问题描述

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

    问总共有多少条不同的路径?

    640?wx_fmt=png

    这是 leetcode 的 62 号题:https://leetcode-cn.com/problems/unique-paths/

    还是老样子,三个步骤来解决。

    步骤一、定义数组元素的含义

    由于我们的目的是从左上角到右下角一共有多少种路径,那我们就定义 dp[i] [j]的含义为:当机器人从左上角走到(i, j) 这个位置时,一共有 dp[i] [j] 种路径。那么,dp[m-1] [n-1] 就是我们要的答案了。

    注意,这个网格相当于一个二维数组,数组是从下标为 0 开始算起的,所以 右下角的位置是 (m-1, n - 1),所以 dp[m-1] [n-1] 就是我们要找的答案。

    步骤二:找出关系数组元素间的关系式

    想象以下,机器人要怎么样才能到达 (i, j) 这个位置?由于机器人可以向下走或者向右走,所以有两种方式到达

    一种是从 (i-1, j) 这个位置走一步到达

    一种是从(i, j - 1) 这个位置走一步到达

    因为是计算所有可能的步骤,所以是把所有可能走的路径都加起来,所以关系式是 dp[i] [j] = dp[i-1] [j] + dp[i] [j-1]。

    步骤三、找出初始值

    显然,当 dp[i] [j] 中,如果 i 或者 j 有一个为 0,那么还能使用关系式吗?答是不能的,因为这个时候把 i - 1 或者 j - 1,就变成负数了,数组就会出问题了,所以我们的初始值是计算出所有的 dp[0] [0….n-1] 和所有的 dp[0….m-1] [0]。这个还是非常容易计算的,相当于计算机图中的最上面一行和左边一列。因此初始值如下:

    dp[0] [0….n-1] = 1; // 相当于最上面一行,机器人只能一直往左走

    dp[0…m-1] [0] = 1; // 相当于最左面一列,机器人只能一直往下走

    撸代码

    三个步骤都写出来了,直接看代码

    public static int uniquePaths(int m, int n) {
        if (m <= 0 || n <= 0) {
            return 0;
        }
    
        int[][] dp = new int[m][n]; // 
          // 初始化
          for(int i = 0; i < m; i++){
          dp[i][0] = 1;
        }
          for(int i = 0; i < n; i++){
          dp[0][i] = 1;
        }
            // 推导出 dp[m-1][n-1]
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
    }
    

    O(n*m) 的空间复杂度可以优化成 O(min(n, m)) 的空间复杂度的,不过这里先不讲。

    案例三、二维数组 DP

    写到这里,有点累了,,但还是得写下去,所以看的小伙伴,你们可得继续看呀。下面这道题也不难,比上面的难一丢丢,不过也是非常类似

    问题描述

    给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

    说明:每次只能向下或者向右移动一步。

    举例:
    输入:
    arr = [
      [1,3,1],
      [1,5,1],
      [4,2,1]
    ]
    输出: 7
    解释: 因为路径 1→3→1→1→1 的总和最小。
    

    和上面的差不多,不过是算最优路径和,这是 leetcode 的第64题:https://leetcode-cn.com/problems/minimum-path-sum/

    还是老样子,可能有些人都看烦了,哈哈,但我还是要按照步骤来写,让那些不大懂的加深理解。有人可能觉得,这些题太简单了吧,别慌,小白先入门,这些属于 medium 级别的,后面在给几道 hard 级别的。

    步骤一、定义数组元素的含义

    由于我们的目的是从左上角到右下角,最小路径和是多少,那我们就定义 dp[i] [j]的含义为:当机器人从左上角走到(i, j) 这个位置时,最下的路径和是 dp[i] [j]。那么,dp[m-1] [n-1] 就是我们要的答案了。

    注意,这个网格相当于一个二维数组,数组是从下标为 0 开始算起的,所以 由下角的位置是 (m-1, n - 1),所以 dp[m-1] [n-1] 就是我们要走的答案。

    步骤二:找出关系数组元素间的关系式

    想象以下,机器人要怎么样才能到达 (i, j) 这个位置?由于机器人可以向下走或者向右走,所以有两种方式到达

    一种是从 (i-1, j) 这个位置走一步到达

    一种是从(i, j - 1) 这个位置走一步到达

    不过这次不是计算所有可能路径,而是计算哪一个路径和是最小的,那么我们要从这两种方式中,选择一种,使得dp[i] [j] 的值是最小的,显然有

    dp[i] [j] = min(dp[i-1][j],dp[i][j-1]) + arr[i][j];// arr[i][j] 表示网格种的值
    
    步骤三、找出初始值

    显然,当 dp[i] [j] 中,如果 i 或者 j 有一个为 0,那么还能使用关系式吗?答是不能的,因为这个时候把 i - 1 或者 j - 1,就变成负数了,数组就会出问题了,所以我们的初始值是计算出所有的 dp[0] [0….n-1] 和所有的 dp[0….m-1] [0]。这个还是非常容易计算的,相当于计算机图中的最上面一行和左边一列。因此初始值如下:

    dp[0] [j] = arr[0] [j] + dp[0] [j-1]; // 相当于最上面一行,机器人只能一直往左走

    dp[i] [0] = arr[i] [0] + dp[i] [0];  // 相当于最左面一列,机器人只能一直往下走

    代码如下
    public static int uniquePaths(int[][] arr) {
          int m = arr.length;
          int n = arr[0].length;
        if (m <= 0 || n <= 0) {
            return 0;
        }
    
        int[][] dp = new int[m][n]; // 
          // 初始化
          dp[0][0] = arr[0][0];
          // 初始化最左边的列
          for(int i = 1; i < m; i++){
          dp[i][0] = dp[i-1][0] + arr[i][0];
        }
          // 初始化最上边的行
          for(int i = 1; i < n; i++){
          dp[0][i] = dp[0][i-1] + arr[0][i];
        }
            // 推导出 dp[m-1][n-1]
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + arr[i][j];
            }
        }
        return dp[m-1][n-1];
    }
    

    O(n*m) 的空间复杂度可以优化成 O(min(n, m)) 的空间复杂度的,不过这里先不讲。更多原创算法文章,可以关注我的公众号『苦逼的码农』

    案例 4:编辑距离

    这次给的这道题比上面的难一些,在 leetcdoe 的定位是 hard 级别。好像是 leetcode 的第 72 号题。

    问题描述

    给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。

    你可以对一个单词进行如下三种操作:

    插入一个字符

    示例 1:
    输入: word1 = "horse", word2 = "ros"
    输出: 3
    解释: 
    horse -> rorse (将 'h' 替换为 'r')
    rorse -> rose (删除 'r')
    rose -> ros (删除 'e')
    

    解答

    还是老样子,按照上面三个步骤来,并且我这里可以告诉你,90% 的字符串问题都可以用动态规划解决,并且90%是采用二维数组。

    步骤一、定义数组元素的含义

    由于我们的目的求将 word1 转换成 word2 所使用的最少操作数 。那我们就定义 dp[i] [j]的含义为:当字符串 word1 的长度为 i,字符串 word2 的长度为 j 时,将 word1 转化为 word2 所使用的最少操作次数为 dp[i] [j]

    有时候,数组的含义并不容易找,所以还是那句话,我给你们一个套路,剩下的还得看你们去领悟。

    步骤二:找出关系数组元素间的关系式

    接下来我们就要找 dp[i] [j] 元素之间的关系了,比起其他题,这道题相对比较难找一点,但是,不管多难找,大部分情况下,dp[i] [j] 和 dp[i-1] [j]、dp[i] [j-1]、dp[i-1] [j-1] 肯定存在某种关系。因为我们的目标就是,从规模小的,通过一些操作,推导出规模大的。对于这道题,我们可以对 word1 进行三种操作

    插入一个字符

    由于我们是要让操作的次数最小,所以我们要寻找最佳操作。那么有如下关系式:

    一、如果我们 word1[i] 与 word2 [j] 相等,这个时候不需要进行任何操作,显然有 dp[i] [j] = dp[i-1] [j-1]。(别忘了 dp[i] [j] 的含义哈)。

    二、如果我们 word1[i] 与 word2 [j] 不相等,这个时候我们就必须进行调整,而调整的操作有 3 种,我们要选择一种。三种操作对应的关系试如下(注意字符串与字符的区别):

    (1)、如果把字符 word1[i] 替换成与 word2[j] 相等,则有 dp[i] [j] = dp[i-1] [j-1] + 1;

    (2)、如果在字符串 word1末尾插入一个与 word2[j] 相等的字符,则有 dp[i] [j] = dp[i] [j-1] + 1;

    (3)、如果把字符 word1[i] 删除,则有 dp[i] [j] = dp[i-1] [j] + 1;

    那么我们应该选择一种操作,使得 dp[i] [j] 的值最小,显然有

    dp[i] [j] = min(dp[i-1] [j-1],dp[i] [j-1],dp[[i-1] [j]]) + 1;

    于是,我们的关系式就推出来了,

    步骤三、找出初始值

    显然,当 dp[i] [j] 中,如果 i 或者 j 有一个为 0,那么还能使用关系式吗?答是不能的,因为这个时候把 i - 1 或者 j - 1,就变成负数了,数组就会出问题了,所以我们的初始值是计算出所有的 dp[0] [0….n] 和所有的 dp[0….m] [0]。这个还是非常容易计算的,因为当有一个字符串的长度为 0 时,转化为另外一个字符串,那就只能一直进行插入或者删除操作了。

    代码如下(可以左右滑动)
    public int minDistance(String word1, String word2) {
        int n1 = word1.length();
        int n2 = word2.length();
        int[][] dp = new int[n1 + 1][n2 + 1];
        // dp[0][0...n2]的初始值
        for (int j = 1; j <= n2; j++) 
            dp[0][j] = dp[0][j - 1] + 1;
        // dp[0...n1][0] 的初始值
        for (int i = 1; i <= n1; i++) dp[i][0] = dp[i - 1][0] + 1;
            // 通过公式推出 dp[n1][n2]
        for (int i = 1; i <= n1; i++) {
            for (int j = 1; j <= n2; j++) {
                  // 如果 word1[i] 与 word2[j] 相等。第 i 个字符对应下标是 i-1
                if (word1.charAt(i - 1) == word2.charAt(j - 1)){
                    p[i][j] = dp[i - 1][j - 1];
                }else {
                   dp[i][j] = Math.min(Math.min(dp[i - 1][j - 1], dp[i][j - 1]), dp[i - 1][j]) + 1;
                }         
            }
        }
        return dp[n1][n2];  
    }
    

    最后说下,如果你要练习,可以去 leetcode,选择动态规划专题,然后连续刷几十道,保证你以后再也不怕动态规划了。当然,遇到很难的,咱还是得挂。

    Leetcode 动态规划直达:https://leetcode-cn.com/tag/dynamic-programming/

    更多算法原创文章,可以关注我的公众号『苦逼的码农

    三、总结

    上面的这些题,基本都是不怎么难的入门题,除了最后一道相对难一点,本来是要在写几道难一点,并且讲如何优化的,不过看了下字数,文章有点长了,关于如何优化的,后面再讲吧,在之后的文章中,我也会按照这个步骤,在给大家讲四五道动态规划 hard 级别的题,会放在每天推文的第二条给大家学习。如果大家感兴趣,文章看的人多,那么优化篇很快就会撸出来,不过感兴趣的人很少的话,动力比较少,可能就会慢一些,所以各位小伙伴,如果觉得有收获,不妨三连走起来,嘻嘻。 

    有道无术,术可成;有术无道,止于术

    欢迎大家关注Java之道公众号

    640?wx_fmt=png

    好文章,我在看❤️

    展开全文
  • 对姿态/欧拉角的理解

    千次阅读 2021-09-16 21:44:22
    描述载体姿态的欧拉角一般可以从两个方面去定义,一种是动态视角,一种是静态视角。本文为笔者对这两种视角的理解。

    姿态角(欧拉角)定义(两种表述):
    1.如图1所示,在飞机(载体)上建立本体坐标系XYZ。滚转(Roll)、俯仰(Pitch)和偏航(Yaw)来表示,分别表示飞机绕Y轴、X轴和Z轴旋转。

    图1 载体本体系示意图

    2.确定一个固定在大地上的静止坐标系xyz,如图2所示,一般x轴朝向载体的目标方向,z轴朝向天空。①俯仰角(Pitch)机体坐标系X轴与水平面的夹角。当X轴的正半轴位于过坐标原点的水平面之上(抬头)时,俯仰角为负,否则为正。②偏航角(Yaw):机体坐标系X轴在水平面上投影与地面坐标系x轴(在水平面上,指向目标为正)之间的夹角,由x轴拟时针转至机体X的投影线时,偏航角为正,即机头左偏航为正,反之为负。③滚转角(Roll):机体坐标系Z轴与通过机体X轴的铅垂面间的夹角,机体向右滚为正,反之为负。

    图2 本体系与静止坐标系关系示意图

    姿态角的解释与理解:实际上,第一种表述还应该加上一个条件,那就是:飞机本体系XYZ的初始姿态是与静止坐标系xyz坐标轴方向重合的,变换的顺序要按照Z—Y—X来进行。也就是说只有按照偏航、俯仰、滚转的顺序进行姿态变换才能使其对应的姿态角单独变化,否则其它的也会变化。使用欧拉角动态描述载体的姿态的变化表面上是规定了一个变化过程,实际上这个过程通常并不用发生。通俗的理解就是不用真走这个流程,而仅仅是一种描述方法。而第二种方法则是从本体系与静止坐标系的关系来定义,侧重描述载体在空间中的状态。使用第一种方法的优点是赋予了变换清晰的物理意义,方便记忆和使用。同时也方便变换矩阵的推导。它们的变换矩阵分别是:

    R\left (\phi \right )=\begin{bmatrix} 1 & 0 & 0\\ 0 & \cos\phi & -\sin \phi\\ 0 & \sin \phi & \cos\phi \end{bmatrix}  

    R\left ( \theta \right )=\begin{bmatrix} \cos\theta & 0 & sin\theta\\ 0 & 1 & 0\\ -sin\theta & 0 & \cos\theta \end{bmatrix}

    R\left ( \psi \right )=\begin{bmatrix} \cos\psi & -sin\psi & 0\\ \sin\psi & \cos\psi & 0\\ 0 & 0 & 1 \end{bmatrix}

    将欧拉角理解成一个描述载体姿态的方法的时候,我们就可以把上面的三个矩阵,整合成一个矩阵。由于变换是以本体系为旋转轴,因此和变换矩阵是三个分变换矩阵的按顺序右成。

    R\! =\! R\left ( \psi \right )R\left ( \theta \right )R\left ( \phi \right )\! =\! \! \begin{bmatrix} \cos\! \theta \cos\psi & \cos\! \psi \sin\! \phi \sin\! \theta - \cos\! \phi \sin\! \psi & \sin\! \phi \sin\! \psi + \cos\! \phi \cos\! \psi \sin\! \theta\\ \cos\!\theta \sin\!\psi & \cos\!\phi \cos\!\psi + \sin\!\phi \sin\!\theta \sin\!\psi& \cos\!\phi \sin\!\theta \sin\!\psi - \cos\!\psi \sin\!\phi\\ -\sin\theta & \cos\!\theta \sin\!\phi & \cos\!\phi \cos\!\theta \end{bmatrix}

    这个变换矩阵的的物理意义也很明确,如下式

    R=\begin{bmatrix} n_{x} & n_{y} & n_{z} \\ o_{x} & o_{y} & o_{z}\\ a_{x} & a_{y} & a_{z} \end{bmatrix}

    行向量\tiny \underset{n}{\rightarrow}\tiny \underset{o}{\rightarrow}\\tiny \underset{a}{\rightarrow}分别表示本体系X轴、Y轴和Z轴在静止坐标系中的单位方向向量。

    展开全文
  • MFC(5):动态五星绘制小练习

    千次阅读 2018-11-13 18:52:54
    需求说明:绘制一个五星,界面有三个按钮,分别为“大”、“中”、“小”;点击相应的按钮,五星会发生变化 解决思路:在五星的外接圆上,选择五个等分点作为五星的五个顶点;根据相邻点不相连的原则,构建...
  • 由于我们的目的是从左上到右下一共有多少种路径,那我们就定义 dp[i] [j]的含义为: 当机器人从左上走到(i, j) 这个位置时,一共有 dp[i] [j] 种路径 。那么,dp[m-1] [n-1] 就是我们要的答案了。 注意,...
  • 此处为方便理解,根据航空中的使用的RPY角定义再对此进行阐释。欧拉角定义方式上的不确定性带来了很多实际当中的困难,所幸在特定领域内,欧拉角通常有统一的定义方式。当中常用的一种是航空领域的,用“偏航-仰俯-...
  • 首先,我们看一下官方定义: 定义: 动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。 动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干...
  • 飞机的姿态

    千次阅读 2022-01-07 20:14:40
    姿态 飞机 惯性信息
  • 定义经过的所有点的数字之和为该条路径的收益,求到达右下的最大收益。 求解: 用动态规划的方法,从左上开始,计算到达每一个点的最大收益。 /** * 用动态规划方法计算: * 用一个数组result[i][j]...
  • 航向:地面坐标系下,车辆真实运动方向(即车辆质心速度)与横轴(横轴就是全局基准X轴)的夹角。航向为图中θ 横摆:指车体纵轴线(也就是x轴)与大地坐标系的横轴(即X轴)的夹角。 车辆质心侧偏角:指车辆...
  • RPY 绕参考坐标系,绕定轴X(Roll)—Y(Pitch)—Z...绕自身坐标系,绕轴Z—Y—X旋转,旋转矩阵右乘。 顺序:绕Z转α,绕Y转β,绕X转γ 公式:R(α,β,γ) = Rot(z,α)Rot(y,β)Rot(x,γ) 求α,β,γ ...
  • 描述旋转运动的物理量 平均旋转速度 如果没有角度的变形 阿尔法和贝塔相等 需要注意的是在将变形时 阿尔法是顺时针旋转 而在这里边阿尔法是逆时针旋转 所以前加以负号 欧米噶z表示旋转的轴为z xy同理 在列出了 ...
  • OBD接口作用和针脚定义图解

    万次阅读 2019-08-06 18:31:46
    OBD接口作用和针脚定义图解 车辆OBD接口,连接车辆ECU行车电脑的接口,检修车辆时把设备解码仪插在此接口,进行扫描车辆是否有故障及故障代码,以后的车联网都是基于此口加以研发的。什么是OBDOBD全称:On Board ...
  • 坐标系定义

    千次阅读 2019-03-07 16:08:34
    通常说的飞行器姿态是指机体坐标系与地面惯性坐标系之间的夹角,可用横滚-roll、俯仰-pitch、偏航-yaw三个表示。    图:...
  • TIA博途中FC功能块的介绍与管脚定义

    千次阅读 2021-08-11 16:11:41
    TIA博途中FC功能块的介绍与管脚定义 FC(功能) 定义 FC(功能)是不含存储区的代码块,常用于对一组输入值执行特定运算,例如:可使用 FC 执行标准运算和可重复使用的运算(例如数学计算)或者执行工艺功能(如使用位...
  • 定义一个矩形类Rectangle,矩形的左上(Left,Top)与右下坐标(Right,Bottom)定义为保护数据成员。用公有成员函数Diagonal()计算出矩形对线的长度,公有成员函数Show()显示矩形左上与右下坐标及对线长度...
  • 【飞机设计】导数

    千次阅读 2019-06-13 14:20:06
    导数是飞行器气动力系数和气动力矩系数对飞行器无因次旋转速度或姿态变化率的导数,是飞行器研制控制系统设计和动态品质分析不可缺少的原始气动参数,它是关系到飞行器的飞行品质、自动驾驶控制系统控制律设计...
  • 7 Babylonjs基础入门 动画

    千次阅读 2019-03-06 00:33:26
    但是它是一个静态的场景,接下来,我们将实现让场景起来。 设置场景中的动画主要有两种方式。第一种是方式是定义一组对象,并在每一个对象上面定义模型的情况。第二种方法更复杂的动画,就是在动画运行时修改。 ...
  • css如何让图片起来?

    千次阅读 2021-06-10 12:02:10
    使用CSS让图片起来需要使用transform属性,使用语法:transform:none|transform-functions;。该属性允许我们对元素进行旋转、缩放、移动或倾斜。使用CSS让图片起来需要使用transform属性。transform 属性向元素...
  • 虚函数 2 之虚函数的定义

    千次阅读 多人点赞 2019-01-24 23:20:34
    1、虚函数的定义 虚函数就是在基类中被关键字 virtual 说明,并在派生类中重新定义的函数。 虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数...
  • 线性代数笔记8:矩阵的对

    万次阅读 多人点赞 2018-04-02 21:33:36
    定义一:若存在可逆矩阵SSS,使得S−1ASS−1ASS^{-1}AS为对矩阵,则称为矩阵AAA是可对化的(diagonalized)。 设n×nn×nn\times n矩阵有nnn个线性无关的特征向量x1,...,xnx1,...,xnx_1,...,x_n,令S=(x1,...,...
  • 最近项目中遇到这样一个要求...这个是我自定xml定义的一个带圆角边框的背景 现在后台返回的颜色.需要代码中进行修改. GradientDrawable drawable = (GradientDrawable) txtConfirm.getBackground(); drawabl
  • c++动态规划经典算例

    万次阅读 多人点赞 2019-06-05 09:46:07
    // ConsoleApplication2.cpp : 定义控制台应用程序的入口点。 // //台阶问题:有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。 #include "stdafx.h" ...
  • 详解动态规划算法

    千次阅读 多人点赞 2020-04-09 07:59:47
    如图示:从 2 走到最底下最短路径为 2+3+5+1 = 11,即为我们所求的 首先我们需要用一个二维数组来表示这个三个形的节点,用二维数组显然可以做到, 第一行的 2 用 a[0][0] 表示,第二行元素 3, 4 用 a[1][0],a[1][1...
  • 机器人RPY和Euler -- 基本公式

    万次阅读 多人点赞 2018-10-30 15:14:55
    参考:《机器人学》 熊有伦等 编著 机械工业出版社。P36~P40 说明:假设两个坐标系A和B,...整个过程,A不B。 旋转矩阵的计算方法如下:R = Rz * Ry *Rx,乘法顺序:从右向左 其中,cα = cosα,sα = ...
  • 教你彻底学会动态规划——入门篇

    万次阅读 多人点赞 2015-08-11 13:26:41
     递归函数有n个参数,就定义一个n维的数组,数组的下标是递归函数参数的取值范围,数组元素的值是递归函数的返回值,这样就可以从边界值开始, 逐步填充数组,相当于计算递归函数值的逆过程。  规解题的一般...
  • [HFSS]Floquet port扫描设置(斜入射)

    千次阅读 多人点赞 2020-10-21 09:46:30
    在单位单元模型中使用扫描时,周期性的平面(这里指阵列平面)应该与全局x-y平面平行。 Floquet port扫描设置1.从边界扫描设置2.Set Up Parametric Sweep of Scan Angle3.Set Up Modes for Parametric
  • 一、建立二维数组并赋值 ... //定义一个六行六列的二维数组 for(i=1;i<6;i++) for(j=1;j<6;j++) a[i][j] = (i/j)*(j/i); //对除第一行以及第一列的所有元素赋值,i/j保留整数值 for(i=1;i<6;i++) {
  • ATX电源引脚定义

    千次阅读 2019-06-14 11:06:26
    无主板启动电源——ATX电源接口各线的定义(注意:电源端,主板端口需镜像) 左下:1#,左上:11#;右上:20# AT电源只要能把电源打开就行了,可现在的ATX电源都是电位控制开关而非机械开关,这...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 178,202
精华内容 71,280
关键字:

动角的定义

友情链接: basicelectronics.rar