Рисование движущейся синусоиды с сглаживанием - PullRequest
6 голосов
/ 19 мая 2011

Я хочу нарисовать движущуюся синусоидальную волну с переменной частотой и переменной амплитудой четким и сглаженным способом. Как это возможно?

Ответы [ 2 ]

11 голосов
/ 20 мая 2011

Итак, я реализовал синусоидальную волну в методе рисования UIView следующим образом:

 float x=75;
 float yc=50;
 float w=0; 
  while (w<=rect.frame.size.width) {
    CGPathMoveToPoint(path, nil, w,y/2);
    CGPathAddQuadCurveToPoint(path, nil, w+x/4, -yc,w+ x/2, y/2);
    CGPathMoveToPoint(path, nil, w+x/2,y/2);
    CGPathAddQuadCurveToPoint(path, nil, w+3*x/4, y+yc, w+x, y/2);
    CGContextAddPath(context, path);
    CGContextDrawPath(context, kCGPathStroke);
    w+=x;
   }

Здесь x - ширина каждой синусоидальной волны, а y - высота кадра.Это нарисует число синусоидальных волн, чтобы уместиться во всем UIViewFrame.Он будет производить четкую синусоидальную волну, а yc - ручку управления.Попробуйте, вам может понравиться.

Если ширина т.е.х аналогична ширине кадра, тогда будет получена одиночная синусоида.

Количество полной синусоидальной волны = (ширина кадра) / ('x' ширина каждой синусоидальной волны)

1 голос
/ 19 февраля 2016

Сделана более полная и быстрая версия версии GeneratorOfOne. Этот также заполняет дно волны выбранным цветом:

class WaveView: UIView {

    private var maskPath: UIBezierPath!
    @IBInspectable var fillColor: UIColor = UIColor.blueColor()
    @IBInspectable var cycles: CGFloat = 7

    override func drawRect(rect: CGRect) {

        var w: CGFloat = 0              // Starting position
        let width = rect.width
        let y: CGFloat = rect.height
        let yc: CGFloat = rect.height / 2
        let x = width/cycles

        let context = UIGraphicsGetCurrentContext();
        CGContextSetFillColorWithColor(context, UIColor.greenColor().CGColor);
        let path = CGPathCreateMutable();

        CGPathMoveToPoint(path, nil, 0, 0)

        while (w<=rect.width) {
            CGPathMoveToPoint(path, nil, w,y/2);
            CGPathAddQuadCurveToPoint(path, nil, w+x/4, -yc, (w+x/2), y/2);
            CGPathMoveToPoint(path, nil, w+x/2,y/2);
            CGPathAddQuadCurveToPoint(path, nil, w+3*x/4, y+yc, w+x, y/2);
            w+=x;
        }

        CGPathAddLineToPoint(path, nil, rect.width, rect.height)
        CGPathAddLineToPoint(path, nil, 0, rect.height)
        CGPathAddLineToPoint(path, nil, 0, y/2);
        CGPathCloseSubpath(path)

        maskPath = UIBezierPath(CGPath: path)
        maskPath.lineCapStyle = CGLineCap.Square
        maskPath.lineJoinStyle = CGLineJoin.Miter

        CGContextAddPath(context, path);
        CGContextSetFillColorWithColor(context, fillColor.CGColor)
        CGContextFillPath(context)
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...