簡體   English   中英

iOS OpenGLES2.0繪圖點的大小正確

[英]iOS OpenGLES2.0 drawing point at correct size

使用下面的代碼,我從大小不同的三角形條上繪制線。 在最后一個三角形的點,我想添加一個GLpoint基元,使它看起來像是一條圓角的末端。 如何根據最終三角形的大小計算GLpoint的正確直徑? 請查看所附圖片,以說明我目前的狀況(該點太大了)。

在此處輸入圖片說明

  - (void)pan:(UIPanGestureRecognizer *)p {

        CGPoint v = [p velocityInView:self.view];
        CGPoint l = [p locationInView:self.view];

       float distance = sqrtf((l.x - previousPoint.x) * (l.x - previousPoint.x) + (l.y - previousPoint.y) * (l.y - previousPoint.y));

        float velocityMagnitude = sqrtf(v.x*v.x + v.y*v.y);
        float clampedVelocityMagnitude = clamp(VELOCITY_CLAMP_MIN, VELOCITY_CLAMP_MAX, velocityMagnitude);
        float normalizedVelocity = (clampedVelocityMagnitude - VELOCITY_CLAMP_MIN) / (VELOCITY_CLAMP_MAX - VELOCITY_CLAMP_MIN);

        float lowPassFilterAlpha = STROKE_WIDTH_SMOOTHING;
        float newThickness = (STROKE_WIDTH_MAX - STROKE_WIDTH_MIN) * normalizedVelocity + STROKE_WIDTH_MIN;
        penThickness = penThickness * lowPassFilterAlpha + newThickness * (1 - lowPassFilterAlpha);

        glBindVertexArrayOES(vertexArrayTriangles);
        glBindBuffer(GL_ARRAY_BUFFER, vertexBufferTriangles);

        if ([p state] == UIGestureRecognizerStateBegan)
        {
            previousPoint = l;
            previousMidPoint = l;

            NISignaturePoint startPoint = {
                {    (l.x / self.view.bounds.size.width * 2. - 1), ((l.y / self.view.bounds.size.height) * 2.0 - 1) * -1, 0}, {0,0,0}
            };
            previousVertex = startPoint;
            previousThickness = penThickness;

            addVertexTriangles(&lengthTriangles, startPoint);
            addVertexTriangles(&lengthTriangles, previousVertex);

        } else if ([p state] == UIGestureRecognizerStateChanged) {

            CGPoint mid = CGPointMake((l.x + previousPoint.x) / 2.0, (l.y + previousPoint.y) / 2.0);

            if (distance > QUADRATIC_DISTANCE_TOLERANCE) {
                // Plot quadratic bezier instead of line
                unsigned int i;

                int segments = (int) distance / 1.5;

                float startPenThickness = previousThickness;
                float endPenThickness = penThickness;
                previousThickness = penThickness;

                for (i = 0; i < segments; i++)
                {
                    penThickness = startPenThickness + ((endPenThickness - startPenThickness) / segments) * i;
                    double t = (double)i / (double)segments;
                    double a = pow((1.0 - t), 2.0);
                    double b = 2.0 * t * (1.0 - t);
                    double c = pow(t, 2.0);
                    double x = a * previousMidPoint.x + b * previousPoint.x + c * mid.x;
                    double y = a * previousMidPoint.y + b * previousPoint.y + c * mid.y;

                    NISignaturePoint v = {
                        {
                            (x / self.view.bounds.size.width * 2. - 1),
                            ((y / self.view.bounds.size.height) * 2.0 - 1) * -1,
                            0
                        },
                        strokeColor
                    };

                    [self addTriangleStripPointsForPrevious:previousVertex next:v];

                    previousVertex = v;
                }
            }        
            previousPoint = l;
            previousMidPoint = mid;

        }
        else if (p.state == UIGestureRecognizerStateEnded | p.state == UIGestureRecognizerStateCancelled)
        {
            addVertexTriangles(&lengthTriangles, previousVertex);
            addVertexTriangles(&lengthTriangles, previousVertex);

            glBindVertexArrayOES(vertexArrayPoints);
            glBindBuffer(GL_ARRAY_BUFFER, vertexBufferPoints);


            NISignaturePoint startPoint = {
                {previousVertex.vertex.x, previousVertex.vertex.y, 0}, strokeColor, ???
            };

            addVertexPoints(&lengthPoints, startPoint);


            penThickness = STROKE_WIDTH_MIN;
            previousThickness = penThickness;
        }
    }



    - (void)addTriangleStripPointsForPrevious:(NISignaturePoint)previous next:(NISignaturePoint)next {
        float toTravel = penThickness / 2.0;

        //NSLog(@"add tri");

        for (int i = 0; i < 2; i++) {
            GLKVector3 p = perpendicular(previous, next);
            GLKVector3 p1 = next.vertex;
            GLKVector3 ref = GLKVector3Add(p1, p);

            float distance = GLKVector3Distance(p1, ref);
            float difX = p1.x - ref.x;
            float difY = p1.y - ref.y;
            float ratio = -1.0 * (toTravel / distance);

            difX = difX * ratio;
            difY = difY * ratio;

            NISignaturePoint stripPoint = {
                { p1.x + difX, p1.y + difY, 0.0 },
                strokeColor
            };
            addVertexTriangles(&lengthTriangles, stripPoint);

            toTravel *= -1;
        }
    }

在此處輸入圖片說明

您可能包括UIGestureRecognizerStateChangedUIGestureRecognizerStateEndedUIGestureRecognizerStateCancelled作為一種情況來畫線,但隨后要檢測后兩種情況以添加直徑等於0.5+endPenThickness

- (void)pan:(UIPanGestureRecognizer *)p {

    CGPoint v = [p velocityInView:self.view];
    CGPoint l = [p locationInView:self.view];

    float distance = sqrtf((l.x - previousPoint.x) * (l.x - previousPoint.x) + (l.y - previousPoint.y) * (l.y - previousPoint.y));

    float velocityMagnitude = sqrtf(v.x*v.x + v.y*v.y);
    float clampedVelocityMagnitude = clamp(VELOCITY_CLAMP_MIN, VELOCITY_CLAMP_MAX, velocityMagnitude);
    float normalizedVelocity = (clampedVelocityMagnitude - VELOCITY_CLAMP_MIN) / (VELOCITY_CLAMP_MAX - VELOCITY_CLAMP_MIN);

    float lowPassFilterAlpha = STROKE_WIDTH_SMOOTHING;
    float newThickness = (STROKE_WIDTH_MAX - STROKE_WIDTH_MIN) * normalizedVelocity + STROKE_WIDTH_MIN;
    penThickness = penThickness * lowPassFilterAlpha + newThickness * (1 - lowPassFilterAlpha);

    glBindVertexArrayOES(vertexArrayTriangles);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBufferTriangles);

    if ([p state] == UIGestureRecognizerStateBegan)
    {
        previousPoint = l;
        previousMidPoint = l;

        NISignaturePoint startPoint = {
            {    (l.x / self.view.bounds.size.width * 2. - 1), ((l.y / self.view.bounds.size.height) * 2.0 - 1) * -1, 0}, {0,0,0}
        };
        previousVertex = startPoint;
        previousThickness = penThickness;

        addVertexTriangles(&lengthTriangles, startPoint);
        addVertexTriangles(&lengthTriangles, previousVertex);

    } else {
        // UIGestureRecognizerStateChanged, UIGestureRecognizerStateEnded, and UIGestureRecognizerStateCancelled

        CGPoint mid = CGPointMake((l.x + previousPoint.x) / 2.0, (l.y + previousPoint.y) / 2.0);

        if (distance > QUADRATIC_DISTANCE_TOLERANCE) {
            // Plot quadratic bezier instead of line
            unsigned int i;

            int segments = (int) distance / 1.5;

            float startPenThickness = previousThickness;
            float endPenThickness = penThickness;
            previousThickness = penThickness;

            for (i = 0; i < segments; i++)
            {
                penThickness = startPenThickness + ((endPenThickness - startPenThickness) / segments) * i;
                double t = (double)i / (double)segments;
                double a = pow((1.0 - t), 2.0);
                double b = 2.0 * t * (1.0 - t);
                double c = pow(t, 2.0);
                double x = a * previousMidPoint.x + b * previousPoint.x + c * mid.x;
                double y = a * previousMidPoint.y + b * previousPoint.y + c * mid.y;

                NISignaturePoint v = {
                    {
                        (x / self.view.bounds.size.width * 2. - 1),
                        ((y / self.view.bounds.size.height) * 2.0 - 1) * -1,
                        0
                    },
                        strokeColor
                };

                [self addTriangleStripPointsForPrevious:previousVertex next:v];

                previousVertex = v;
            }
        }        
        previousPoint = l;
        previousMidPoint = mid;

        if (p.state == UIGestureRecognizerStateEnded | p.state == UIGestureRecognizerStateCancelled)
        {
            glBindVertexArrayOES(vertexArrayPoints);
            glBindBuffer(GL_ARRAY_BUFFER, vertexBufferPoints);

            NISignaturePoint startPoint = {
                {previousVertex.vertex.x, previousVertex.vertex.y, 0}, strokeColor, endPenThickness / 2.
            };

            addVertexPoints(&lengthPoints, startPoint);

            penThickness = STROKE_WIDTH_MIN;
            previousThickness = penThickness;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM