使用贝塞尔曲线算法实现毛笔签名效果

最近项目中有个需要签名的地方,要用到手写签名,开始只是简单的实现手写签名,如图:
这里写图片描述

后来领导说,能不能实现像毛笔那样签名的效果,那好吧,领导说怎样就怎样吧,而且我也觉得这里用毛笔效果会更好些。那就只好运用贝塞尔曲线的原理了。实现如下:

/**
     * This view implements the drawing canvas.
     * 
     * It handles all of the input events and drawing functions.
     */
    class PaintView extends View {
        private Paint paint;
        private Canvas cacheCanvas;
        private Bitmap cachebBitmap;
        private Path path;
        private List<TimePoint> mPoints = new ArrayList<>();
        private float mVelocityFilterWeight;
        private float mLastTouchX;
        private float mLastTouchY;
        private float mLastVelocity;
        private float mLastWidth;
        private int mMinWidth;
        private int mMaxWidth;
        private RectF mDirtyRect;

        public Bitmap getCachebBitmap() {
            return cachebBitmap;
        }

        public void setSignatureBitmap(Bitmap signature) {
            clear();
            ensureSignatureBitmap();
            RectF tempSrc = new RectF();
            RectF tempDst = new RectF();

            int dWidth = signature.getWidth();
            int dHeight = signature.getHeight();
            int vWidth = getWidth();
            int vHeight = getHeight();

            // Generate the required transform.
            tempSrc.set(0, 0, dWidth, dHeight);
            tempDst.set(0, 0, vWidth, vHeight);

            Matrix drawMatrix = new Matrix();
            drawMatrix.setRectToRect(tempSrc, tempDst, Matrix.ScaleToFit.START);

            Canvas canvas = new Canvas(cachebBitmap);
            canvas.drawBitmap(signature, drawMatrix, null);
            // setIsEmpty(false);
            invalidate();
        }

        public PaintView(Context context, AttributeSet attrs) {
            super(context, attrs);
            TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
                    R.styleable.SignaturePad, 0, 0);

            // Configurable parameters
            try {
                mMinWidth = a.getDimensionPixelSize(
                        R.styleable.SignaturePad_minWidth, convertDpToPx(3));
                mMaxWidth = a.getDimensionPixelSize(
                        R.styleable.SignaturePad_maxWidth, convertDpToPx(12));
                mVelocityFilterWeight = a.getFloat(
                        R.styleable.SignaturePad_velocityFilterWeight, 0.6f);
            } finally {
                a.recycle();
            }
            init();
        }

        private void init() {
            paint = new Paint();
            paint.setAntiAlias(true);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setStyle(Paint.Style.STROKE);
            paint.setColor(Color.BLACK);
            path = ne
  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 我可以为你提供一些关于使用C语言实现贝塞尔曲线算法用来平滑多边形的建议。首先,你需要确定要用贝塞尔曲线绘制多边形的顶点。然后,定义一个函数来计算贝塞尔曲线的坐标,并使用循环来更新坐标。最后,通过把坐标连接起来,就可以得到一个平滑的多边形。 ### 回答2: 贝塞尔曲线是一种平滑曲线算法,可以用于在计算机图形学中绘制平滑的曲线。在C语言中,可以使用贝塞尔曲线算法实现对多边形的平滑处理。 首先,我们需要定义一个数据结构来表示多边形,可以使用数组或链表来存储多边形的顶点坐标。然后,我们需要实现贝塞尔曲线算法的核心部分。 贝塞尔曲线的计算涉及到多个控制点和插值点的计算。在C语言中,可以使用二维数组或结构体数组来存储这些点的坐标。通过计算贝塞尔曲线的控制点,可以得到对应的插值点,从而绘制出平滑的曲线。 在实现贝塞尔曲线算法时,可以使用递归的方式来进行计算。通过递归,我们可以将贝塞尔曲线的计算分解为多个小的计算步骤。首先,我们需要计算出插值点的坐标,并将其存储在一个数组中。然后,根据插值点的计算结果,再次调用计算函数,直到达到我们预期的精度或迭代次数。 最后,将计算出的插值点坐标转换为平滑的多边形。可以使用线段连接插值点来绘制曲线,或者根据插值点来调整多边形的顶点坐标。 总结来说,通过使用C语言实现贝塞尔曲线算法,我们可以对多边形进行平滑处理。这需要定义数据结构来存储多边形的顶点坐标,并实现贝塞尔曲线算法的计算部分。最后,将计算出的插值点转换为平滑的多边形。 ### 回答3: 贝塞尔曲线是一种平滑曲线,可以通过给定的控制点来绘制曲线。使用C语言实现贝塞尔曲线算法可以用来平滑多边形的边缘,增加其美观性。 贝塞尔曲线算法实现过程如下: 1. 首先定义需要绘制贝塞尔曲线的控制点。根据需要平滑的多边形边缘形状,选择适当数量的控制点。 2. 确定绘制曲线的分割段数,即在曲线上选择的离散点数量。 3. 根据控制点之间的位置关系,使用贝塞尔曲线算法计算每个分割段上的点坐标。 4. 在C语言中,可以使用循环结构和数学函数来实现这种计算。 5. 将计算得到的点坐标连接起来,即可绘制出平滑曲线多边形的边缘。 贝塞尔曲线算法的关键在于计算每个点的坐标,主要涉及到点的插值和权重计算。C语言提供了诸如 pow()、sqrt()、sin() 等数学函数来辅助实现这些计算。通过迭代计算控制点和分割段之间的点,可以得到平滑曲线多边形的边缘。 使用C语言实现贝塞尔曲线算法可以增加多边形的美观性,使其边缘更加平滑和流畅。这在图形处理、游戏开发、界面设计等领域都有广泛应用。因此,学习和使用贝塞尔曲线算法是C语言程序员的一项重要技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值