精华内容
下载资源
问答
  • iOS原生渐变只支持线性...对于贝塞尔曲线绘制,系统提供了一系列方法,同时我们已可以通过公式计算出一条贝塞尔曲线。如何保证颜色渐变?找到曲线上点,计算出每一个点色值。只要解决上面问题就可以出...

    iOS原生的渐变只支持线性的渐变,但有的时候我们需要沿曲线进行渐变。

    先看下垂直线性渐变与沿曲线线性渐变的区别

    垂直线性渐变:颜色最亮的地方在曲线的最低点

    沿曲线线性渐变:颜色最亮的地方在起点

    那么先来分析一下这个问题:

    怎样绘制曲线?

    对于贝塞尔曲线的绘制,系统提供了一系列的方法,同时我们已可以通过公式计算出一条贝塞尔曲线。

    如何保证颜色渐变?

    找到曲线上的点,计算出每一个点的色值。

    只要解决上面的问题就可以画出一条沿曲线线性渐变的贝塞尔曲线,曲线画起来还是比较简单的,但是这样计算出每一点的色值是一件比较麻烦的事情。

    1、贝塞尔曲线

    这里先介绍一下贝塞尔曲线的一些东西,以二次贝塞尔曲线为例,先来动态感受一下绘制过程

    二次贝塞尔曲线

    一条二次贝塞尔曲线需要三个点,A:起点 ;B:控制点;C:终点

    然后在AB上取点E,在BC上取点F 。使AD:AB = BE:BC

    第一次取点

    在DE上取点F,使DF:DE = AD:AB = BE:BC

    第二次取点

    F点就是贝塞尔曲线上的一个点,以此类推,取点一系列的点之后在ABC之间就产生了一条贝塞尔曲线

    贝塞尔曲线

    可以看出贝塞尔曲线上的每个点是有规律的,二次贝塞尔曲线的方程为

    P0:起点;P1:控制点; P2:终点 ;t:百分比

    二次贝塞尔曲线的方程

    用OC表达的话就是这样的

    CGFloat x = pow((1-t), 2) * _startPoint.x + 2 * (1-t) * t * _controlPoint.x + pow(t, 2) * _endPoint.x;

    CGFloat y = pow((1-t), 2) * _startPoint.y + 2 * (1-t) * t * _controlPoint.y + pow(t, 2) * _endPoint.y;

    2、渐变色

    既然已经一颗贝塞尔曲线的方程,那就可以操作曲线上的每一个点了,那怎么设置每一个点的颜色的。

    1、取点

    对于取点还有一个问题需要注意,由于贝塞尔曲线并不是匀速变化的,所有如果均匀分割 t 来进行取点的话,取出来的点是不均匀的。不均匀的点会造成有的地方缺失点,形成空白。所以需要对 t 进行修正,取出间隔均匀的点。

    均匀间隔的 t

    想要均匀的点,就需要线计算出曲线长度,接下来就使用辛普森积分法来计算曲线的长度。这个求的是二次贝塞尔曲线的长度,如果需更高次的曲线,可修改一下修改。

    //曲线长度

    - (CGFloat)lengthWithT:(CGFloat)t{

    NSInteger totalStep = 1000;

    NSInteger stepCounts = (NSInteger)(totalStep * t);

    if(stepCounts & 1) stepCounts++;

    if(stepCounts==0) return 0.0;

    NSInteger halfCounts = stepCounts/2;

    CGFloat sum1=0.0, sum2=0.0;

    CGFloat dStep = (t * 1.0)/stepCounts;

    for(NSInteger i=0; i

    sum1 += [self speedAtT:(2*i+1)*dStep];

    }

    for(NSInteger i=1; i

    sum2 += [self speedAtT:(2*i)*dStep ];

    }

    return ([self speedAtT:0]+[self speedAtT:1]+2*sum2+4*sum1)*dStep/3.0;

    }

    - (CGFloat)speedAtT:(CGFloat)t {

    CGFloat xSpeed = [self xSpeedAtT:t];

    CGFloat ySpeed = [self ySpeedAtT:t];

    CGFloat speed = sqrt(pow(xSpeed, 2) + pow(ySpeed, 2));

    return speed;

    }

    - (CGFloat)xSpeedAtT:(CGFloat)t {

    return 2 * (_startPoint.x + _endPoint.x - 2 * _controlPoint.x) * t + 2 * (_controlPoint.x - _startPoint.x);;

    }

    - (CGFloat)ySpeedAtT:(CGFloat)t {

    return 2 * (_startPoint.y + _endPoint.y - 2 * _controlPoint.y) * t + 2 * (_controlPoint.y - _startPoint.y);

    }

    - (CGFloat)xAtT:(CGFloat)t {

    CGFloat x = pow((1-t), 2) * _startPoint.x + 2 * (1-t)* t * _controlPoint.x + pow(t, 2) * _endPoint.x;

    return x;

    }

    - (CGFloat)yAtT:(CGFloat)t {

    CGFloat y = pow((1-t), 2) * _startPoint.y + 2 * (1-t) * t * _controlPoint.y + pow(t, 2) * _endPoint.y;

    return y;

    }

    接下里就就开始矫正间隔了

    //矫正间隔

    - (CGFloat)uniformSpeedAtT:(CGFloat)t {

    CGFloat totalLength = [self lengthWithT:1.0];

    CGFloat len = t*totalLength;

    CGFloat t1=t, t2;

    do {

    t2 = t1 -([self lengthWithT:t1] - len)/[self speedAtT:t1];

    if(fabs(t1-t2)<0.001) break;

    t1=t2;

    }while(true);

    return t2;

    }

    矫正间隔的取点

    加上颜色,就是这样了

    均匀的渐变色点

    接下来就是要去足够多的点来连成曲线了,这个取点的个数要根据具体情况来定,

    考虑到线的边界问题,处理起来太费事了,要进行更多的色值计算

    曲线的边界

    我的做法是先按线段长度取点,然后再根据每个点的速度及方向进行上下左右偏移,得到一条宽度足够的线之后在进行mask裁剪。

    偏移得到足够宽的线

    最终效果

    这个取点的方案还不是很完善,先放个demo吧至少效果是出来了,可以看一下具体的样子。

    展开全文
  • 泡泡是平面设计中经常要用到一种素材,那么,怎样自己画一个透明泡泡呢?其实方法非常简单。首先,我们在PS里新建一个画布,将背景填充黑色。接下来,我们绘制水平居中和垂直居中参考线,便于后面对齐。...

    今天我们给大家带来一篇PS实例教程,教大家绘制一个透明的泡泡。

    19534e2955bb92039d0fdaa62d902c73.png

    泡泡是平面设计中经常要用到的一种素材,那么,怎样自己画一个透明的泡泡呢?其实方法非常简单。

    首先,我们在PS里新建一个画布,将背景填充黑色。

    33737e001d287faed77659fc5a42c51d.png

    接下来,我们绘制水平居中和垂直居中的两条参考线,便于后面的对齐。

    9bdf0698a77ae904c7c71b8a3f3a4413.png

    接下来,我们新建一个空白图层,使用椭圆选框工具按住Shift键绘制一个正圆,并将这个正圆与画布居中对齐(参考线对齐)。

    4d33cde838fcfa3ea823e62fad677337.png

    我们将这个正圆填充白色,然后右击选择“羽化”,设置半径为25像素(根据具体的情况来定),按Delete键删除,这样,一个透明泡泡的轮廓就绘制完成了。

    6469afec6b6df5549a1b25409976eb94.png

    接下来,我们使用画笔工具,选择默认的柔边圆画笔,适当降低画笔的不透明度,在泡泡的边缘绘制几道白色的圆弧作为高光。

    72ff7e3270334a1b5fc0e2bfee458390.png

    接下来,我们继续使用椭圆选框工具,按住Shift键,在中心绘制一个小一点的正圆,新建一个空白图层,给它填充深灰色。

    ee7202e0656331b5972d8e7e7849b9ad.png

    我们选择“滤镜”-“像素化”-“彩色半调”,设置默认的参数即可。

    3f24209da1e09f53c0eb0d386acad0ba.png

    我们继续执行“滤镜”-“扭曲”-“球面化”,数量设置为30左右。

    5ee4c0191c5d8a40981340714dcd0a32.png

    我们继续执行“滤镜”-“模糊”-“高斯模糊”,数量设置36左右。

    6b4d04cb4fd400c74f1ca34e640e5fea.png

    最后,我们将深色圆图层的混合模式改为“柔光”,并适当调整深色圆的大小即可。

    43e583a49f9f534b460371a6633ef4bf.png

    怎么样,这个气泡绘制起来是不是很简单呢?

    今天的教程就是这样了,如果你想了解更多和设计相关的内容,欢迎关注我的头条号!

    展开全文
  • 554. 砖墙 你面前有堵矩形、由 n 行砖块组成砖墙。这些砖块高度相同(也就是个单位高)但是宽度不同。每行砖块宽度之和...你需要找出怎样画才能使这条线 穿过砖块数量最少 ,并且返回 穿过砖块数量

    554. 砖墙

    你的面前有一堵矩形的、由 n 行砖块组成的砖墙。这些砖块高度相同(也就是一个单位高)但是宽度不同。每一行砖块的宽度之和应该相等。

    你现在要画一条 自顶向下 的、穿过 最少 砖块的垂线。如果你画的线只是从砖块的边缘经过,就不算穿过这块砖。你不能沿着墙的两个垂直边缘之一画线,这样显然是没有穿过一块砖的。

    给你一个二维数组 wall ,该数组包含这堵墙的相关信息。其中,wall[i] 是一个代表从左至右每块砖的宽度的数组。你需要找出怎样画才能使这条线 穿过的砖块数量最少 ,并且返回 穿过的砖块数量 。

    示例 1:

    输入:wall = [[1,2,2,1],[3,1,2],[1,3,2],[2,4],[3,1,2],[1,3,1,1]]
    输出:2
    

    示例 2:

    输入:wall = [[1],[1],[1]]
    输出:3
    

    提示

    • n == wall.length
    • 1 <= n <= 104
    • 1 <= wall[i].length <= 104
    • 1 <= sum(wall[i].length) <= 2 * 104
    • 对于每一行 i ,sum(wall[i]) 应当是相同的
    • 1 <= wall[i][j] <= 231 - 1

    方法一:哈希表

    要想穿过的砖块数量最少,必然这条垂线要穿过尽可能多的间隙。

    遍历每一行砖块,使用哈希表储存间隙的位置,其中 key 为间隙的水平位置,value 为行的数量。总行数 减去 最多的间隙行数 就是结果。

    参考代码

    public int leastBricks(List<List<Integer>> wall) {
       Map<Long, Integer> map = new HashMap<>();
        int max = 0;
        for(List<Integer> row : wall) {
            long gap = 0;
            for(int j = 0; j < row.size() - 1; j++) {
                gap += row.get(j);
                int count = map.getOrDefault(gap, 0) + 1;
                map.put(gap, count);
                max = Math.max(max, count);
            }
        }
        return wall.size() - max;
    }
    

    执行结果
    在这里插入图片描述

    展开全文
  • 题目: 你面前有堵矩形、由 n 行砖块组成砖墙。这些砖块高度相同(也就是个单位高)但是宽度不同。...你需要找出怎样画才能使这条线 穿过砖块数量最少 ,并且返回 穿过砖块数量 。 解

    题目:
    你的面前有一堵矩形的、由 n 行砖块组成的砖墙。这些砖块高度相同(也就是一个单位高)但是宽度不同。每一行砖块的宽度之和相等。

    你现在要画一条 自顶向下 的、穿过 最少 砖块的垂线。如果你画的线只是从砖块的边缘经过,就不算穿过这块砖。你不能沿着墙的两个垂直边缘之一画线,这样显然是没有穿过一块砖的。

    给你一个二维数组 wall ,该数组包含这堵墙的相关信息。其中,wall[i] 是一个代表从左至右每块砖的宽度的数组。你需要找出怎样画才能使这条线 穿过的砖块数量最少 ,并且返回 穿过的砖块数量 。
    在这里插入图片描述
    在这里插入图片描述

    解答:

    class Solution:
        def leastBricks(self, wall: List[List[int]]) -> int:
            #res记录每一行中缝隙所处的位置
            res=[]
            m=len(wall)
            for i in range(m):
                n=len(wall[i])
                tmp=0
                for j in range(n-1):
                    tmp+=wall[i][j]
                    res.append(tmp)
            
            dic=collections.Counter(res)
            
            maxv=0
            for key,val in dic.items():
                if val>maxv :
                    maxv=val
            return m-maxv
    
    展开全文
  • 554. 砖墙 你面前有堵矩形、由 n 行砖块组成砖墙。这些砖块高度相同(也就是个单位高)但是宽度不同。每行砖块宽度之和...你需要找出怎样画才能使这条线 穿过砖块数量最少 ,并且返回 穿过砖块数量
  • 题目: 你面前有堵矩形、由 n 行砖块组成砖墙。这些砖块高度相同(也就是个单位高)但是宽度不同。每行砖块宽度之和...你需要找出怎样画才能使这条线 穿过砖块数量最少 ,并且返回 穿过砖块数量 。
  • 力扣每日题 题目描述 你面前有堵矩形、由 n 行砖块组成砖墙。这些砖块高度相同(也就是个单位高)但是宽度不同。...你需要找出怎样画才能使这条线 穿过砖块数量最少 ,并且返回 穿过
  • 面前有堵矩形、由 n 行砖块组成砖墙。这些砖块高度相同(也就是个单位高)但是宽度不同。...你需要找出怎样画才能使这条线 穿过砖块数量最少 ,并且返回穿过砖块数量 。 原题地址:地址 实.
  • 你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这样显然是没有穿过块砖。 示例: 输入: [ [1,2,2,1], [3,1,2], [1,3,2], [2,4], [3,1,2], [1...
  • 、Problem ...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这样显然是没有穿过块砖。 输入: [[1,2,2,1], [3,1,2], [1,3,2], [2
  • Java实现 LeetCode 554 砖墙(缝隙可以放在数组?)

    万次阅读 多人点赞 2020-03-26 10:59:39
    554. 砖墙 你面前有堵方形、由多行砖块组成砖墙。...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这样显然是没有穿过块砖...
  • 554. 砖墙

    千次阅读 2019-05-22 08:37:44
    面前有堵方形、由多行砖块组成砖墙。...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这样显然是没有穿过块砖。 ...
  • 【 你面前有堵方形、由多行砖块组成砖墙。...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这样显然是没有穿过块砖。...
  • LeetCode-Python-554. 砖墙

    2019-03-28 19:36:18
    面前有堵方形、由多行砖块组成砖墙。...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这样显然是没有穿过块砖。 ...
  • 经度和纬度确定

    2010-11-19 09:03:00
    地球是在不停地绕地轴旋转(地轴是一根通过地球南北两极和地球中心假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上每一点都和南北两极距离相等,这个圆圈就叫作“赤道”。在赤道南北
  • 面前有堵方形、由多行砖块组成砖墙。...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这样显然是没有穿过块砖。 初看此题...
  • Leetcode 554.砖墙

    2019-02-14 12:46:00
    砖墙 你面前有堵方形、由多行砖块组成砖墙。...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这样显然是没有穿过...
  • 【力扣算法】554-砖墙

    2019-06-03 19:01:26
    题目 你面前有堵方形、由多行砖块组成砖墙。...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这样显然是没有穿过块砖。 示例...
  • LeetCode 554.砖墙

    2019-03-07 21:09:18
    LeetCode 554.砖墙 你面前有堵方形、由多行砖块组成砖墙。 这些砖块高度相同但是...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这...
  • LeetCode之554.砖墙

    2020-05-04 22:22:44
    554. 砖墙题目分析代码 题目 你面前有堵方形、由多行砖块组成砖墙。...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这样显...
  • 面前有堵方形、由多行砖块组成砖墙。...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这样显然是没有穿过块砖。 示例: 输...
  • LeetCode 554. 砖墙

    2019-01-17 22:30:28
    面前有堵方形、由多行砖块组成砖墙。...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这样显然是没有穿过块砖。  ...
  • 97、砖墙

    2019-05-06 22:13:59
    题目描述: 你面前有堵方形、由多行砖块组成砖墙。...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这样显然是没有穿过块砖。...
  • leetcode554_砖墙

    2018-12-11 23:48:09
    面前有堵方形、由多行砖块组成砖墙。...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这样显然是没有穿过块砖。  ...
  • LeetCode554-Brick Wall

    2019-03-05 11:33:07
    题目描述 你面前有堵方形、由多行砖块组成砖墙。...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。你不能沿着墙两个垂直边缘之画线,这样显然是没有穿过块砖。 示例 ...
  • 面前有堵方形、由多行砖块组成砖墙。...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这样显然是没有穿过块砖。  ...
  • LeetCode-554. 砖墙

    2019-03-06 22:00:27
    554. 砖墙 你面前有堵方形、由多行砖块组成砖墙。...你需要找出怎样画才能使这条线穿过砖块数量最少,并且返回穿过砖块数量。 你不能沿着墙两个垂直边缘之画线,这样显然是没有穿过块砖...

空空如也

空空如也

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

怎样画一条线的垂直线