zoukankan      html  css  js  c++  java
  • Quartz和OpenGL绘图-iphone学习日记(一)

    quartz绘图:

     

     

        CGContextRef context = UIGraphicsGetCurrentContext();//实例一个context上下文

     

     

        CGContextSetLineWidth(context, 2.0);  //设置画笔的粗细

        CGContextSetStrokeColorWithColor(context, currentColor.CGColor);//设置画笔的颜色

         CGContextSetFillColorWithColor(context, currentColor.CGColor);//设置填充色块的颜色

     


     

           // case kLineShape:

                CGContextMoveToPoint(context, firstTouch.x, firstTouch.y);//起始位置

                CGContextAddLineToPoint(context, lastTouch.x, lastTouch.y);//结束位置

                CGContextStrokePath(context);

     

     

         //   case kRectShape:

                CGContextAddRect(context, currentRect);//添加要画的currentRect

                CGContextDrawPath(context, kCGPathFillStroke);

     

           // case kEllipseShape:

                CGContextAddEllipseInRect(context, currentRect);添加要画的Ellipse

                CGContextDrawPath(context, kCGPathFillStroke);

     

     

           //case kImageShape: 

     

                CGFloat horizontalOffset = drawImage.size.width / 2;

                CGFloat verticalOffset = drawImage.size.height / 2;

                CGPoint drawPoint = CGPointMake(lastTouch.x - horizontalOffset,

                                                lastTouch.y - verticalOffset);

                [drawImage drawAtPoint:drawPoint];    //drawImage为UIImage的实例

     

     

     

     

     

     

    opengl画图:

     

     

        glLoadIdentity();//重定义虚拟机

    glClearColor(0.78f, 0.78f, 0.78f, 1.0f);//重设背景颜色

        glClear(GL_COLOR_BUFFER_BIT);

        CGColorRef color = currentColor.CGColor;//分割uicolor为4个组件

        const CGFloat *components = CGColorGetComponents(color);

        CGFloat red = components[0];

        CGFloat green = components[1];

        CGFloat blue = components[2];

        //重置color组件

        glColor4f(red,green, blue, 1.0);

     

     //case kLineShape:

                glDisable(GL_TEXTURE_2D);//设置为不要贴图效果

                GLfloat vertices[4];//浮点的数组存储x1,y1,x2,y2四个坐标

                // Convert coordinates

                vertices[0] =  firstTouch.x;

                vertices[1] = self.frame.size.height - firstTouch.y;

                vertices[2] = lastTouch.x;

                vertices[3] = self.frame.size.height - lastTouch.y;

                glLineWidth(2.0);//画笔的宽度

                glVertexPointer (2, GL_FLOAT , 0, vertices);

                glDrawArrays (GL_LINES, 0, 2);//画线

     

     

     

     

          //  case kRectShape: 

                glDisable(GL_TEXTURE_2D);

                // Calculate bounding rect and store in vertices

                GLfloat vertices[8];

                GLfloat minX = (firstTouch.x > lastTouch.x) ?

                lastTouch.x : firstTouch.x;

                GLfloat minY = (self.frame.size.height - firstTouch.y > 

                                self.frame.size.height - lastTouch.y) ? 

                self.frame.size.height - lastTouch.y : 

                self.frame.size.height - firstTouch.y;

                GLfloat maxX = (firstTouch.x > lastTouch.x) ?

                firstTouch.x : lastTouch.x;

                GLfloat maxY = (self.frame.size.height - firstTouch.y > 

                                self.frame.size.height - lastTouch.y) ? 

                self.frame.size.height - firstTouch.y : 

                self.frame.size.height - lastTouch.y;

     

                vertices[0] = maxX;

                vertices[1] = maxY;

                vertices[2] = minX;

                vertices[3] = maxY;

                vertices[4] = minX;

                vertices[5] = minY;

                vertices[6] = maxX;

                vertices[7] = minY;

     

                glVertexPointer (2, GL_FLOAT , 0, vertices);

                glDrawArrays (GL_TRIANGLE_FAN, 0, 4);///画方形

     

     

     

        //    case kEllipseShape: 

                glDisable(GL_TEXTURE_2D);

                GLfloat vertices[720];//360个点的x,y

                GLfloat xradius = (firstTouch.x > lastTouch.x) ?//计算椭圆的水平半径

                (firstTouch.x - lastTouch.x)/2 : 

                (lastTouch.x - firstTouch.x)/2;

                GLfloat yradius = (self.frame.size.height - firstTouch.y > //计算椭圆的垂直半径

                                   self.frame.size.height - lastTouch.y) ? 

                ((self.frame.size.height - firstTouch.y) - 

                 (self.frame.size.height - lastTouch.y))/2 : 

                ((self.frame.size.height - lastTouch.y) -

                 (self.frame.size.height - firstTouch.y))/2; 

                for (int i = 0; i <= 720; i+=2) { //围绕圆进行循环,计算正确的点

                    GLfloat xOffset = (firstTouch.x > lastTouch.x) ?

                    lastTouch.x + xradius 

                    : firstTouch.x + xradius;

                    GLfloat yOffset = (self.frame.size.height - firstTouch.y > 

                                       self.frame.size.height - lastTouch.y) ?

                    self.frame.size.height - lastTouch.y + yradius : 

                    self.frame.size.height - firstTouch.y + yradius;

                    vertices[i] = (cos(degreesToRadian(i))*xradius) + xOffset;

                    vertices[i+1] = (sin(degreesToRadian(i))*yradius) +

                    yOffset;

     

                }

                glVertexPointer (2, GL_FLOAT , 0, vertices);//顶点数据传给gl 并通知上下文渲染图像

                glDrawArrays (GL_TRIANGLE_FAN, 0, 360);//画圆形

     

     

     

     

     

         //   case kImageShape:

                glEnable(GL_TEXTURE_2D);

                [sprite drawAtPoint:CGPointMake(lastTouch.x, self.frame.size.height - lastTouch.y)];

    //画图片 sprite为GL_TEXTURE_2D的一个实例 需要加上GL_TEXTURE_2D.h的头文件和.m文件

     

     

     

     

    另外如何写一个很好使用的随机方法的接口呢?如下写一个随机颜色的方法:

    UIColor-Random.h//头文件

     

     

    #import <UIKit/UIKit.h>

    @interface UIColor(Random)

    +(UIColor *)randomColor;

    @end

     

     

     

    UIColor-Random.m//m文件

     

     

    #import "UIColor-Random.h"

    @implementation UIColor(Random)

    +(UIColor *)randomColor

    {

        static BOOL seeded = NO;

        if (!seeded) {

            seeded = YES;

            srandom(time(NULL));

        }

        CGFloat red =  (CGFloat)random()/(CGFloat)RAND_MAX;

        CGFloat blue = (CGFloat)random()/(CGFloat)RAND_MAX;

        CGFloat green = (CGFloat)random()/(CGFloat)RAND_MAX;

        return [UIColor colorWithRed:red green:green blue:blue alpha:1.0f];

    }

    @end

     

     

    在需要用的.m文件里#import "UIColor-Random.h"就可以用(UIColor *)randomColor的这个方法了


  • 相关阅读:
    React方法论
    React学习记录
    LeetCode 530. Minimum Absolute Difference in BST
    LeetCode 521. Longest Uncommon Subsequence I
    LeetCode 520. Detect Capital
    LeetCode 516. Longest Palindromic Subsequence
    LeetCode 513. Find Bottom Left Tree Value
    LeetCode 506. Relative Ranks
    LeetCode 504. Base 7
    LeetCode 500. Keyboard Row
  • 原文地址:https://www.cnblogs.com/iapp/p/3631779.html
Copyright © 2011-2022 走看看