view Source/MyPlot.cpp @ 13:989865d55c73 tip

Commit.
author martinm_home <martin.morrell@eecs.qmul.ac.uk>
date Thu, 27 Sep 2012 23:30:29 +0100
parents 87dc3d84c120
children
line wrap: on
line source
//
//  MyPlot.cpp
//  ClassicAmbiDec
//
//  Created by Martin Morrell on 25/06/2012.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#include "MyPlot.h"



    
polarPlot::polarPlot(const CRect &size): CView (size)
{
    stereo_mode = 0;
    pattern = 0.5;
    width = 45;
    centre_pattern = 0.5;
    centre_gain = 0;
    surround_mode = 0;
    surround_pattern = 0.5;
    surround_width = 60;
    surround_mode = 0;
    decoder_mode = 0;
    decoder_prev = 0;
};
    

    
    
void polarPlot::draw (CDrawContext* context)
{
    //Plot background circle
    circle(context);
    
    
    //Plot Needed Polar Patterns
    switch (decoder_mode) {
        case 2:
            //Stereo Mic Patterns
            leftMicPattern(context);
            rightMicPattern(context);
            break;
            
        case 3:
            //2.1 Mic Patterns
            leftMicPattern(context);
            rightMicPattern(context);
            break;
            
        case 4:
            //Quad Mic Patterns
            leftMicPattern(context);
            rightMicPattern(context);
            lsMicPattern(context);
            rsMicPattern(context);
            break;
            
        case 5:
            switch (decoder_mode5x) {
                case 0:
                    //5.0 Mic Patterns
                    leftMicPattern(context);
                    rightMicPattern(context);
                    centreMicPattern(context);
                    lsMicPattern(context);
                    rsMicPattern(context);
                    break;
                case 1:
                    //Heller 1 Plot
                    heller1Pattern(context);
                    break;
                case 2:
                    //Heller 2 Plot
                    heller2Pattern(context);
                    break;
                    
                default:
                    break;
            }
            
            break;
            
        case 6:
            switch (decoder_mode5x) {
                case 0:
                    //5.1 Mic Patterns
                    leftMicPattern(context);
                    rightMicPattern(context);
                    centreMicPattern(context);
                    lsMicPattern(context);
                    rsMicPattern(context);
                    break;
                case 1:
                    //Heller 1 Plot
                    heller1Pattern(context);
                    break;
                case 2:
                    //Heller 2 Plot
                    heller2Pattern(context);
                    break;
                    
                default:
                    break;
            }
            break;
            
            
        default:
            break;
    }
    
    setDirty(false);
};


void polarPlot::circle(CDrawContext *context)
{
    //Plot Ellipse - Background Circle
    context->setLineWidth (3);
    CColor eclColor = CColor(120,120,120,125);
    context->setFrameColor(eclColor);
    ;
    CRect circleSize = CRect(size.getCenter().x-size.getHeight()/2*0.82, size.getCenter().y-size.getHeight()/2*0.82, size.getCenter().x+size.getHeight()/2*0.82,  size.getCenter().y+size.getHeight()/2*0.82);
    context->drawEllipse(circleSize);
};


    
void polarPlot::leftMicPattern(CDrawContext* context)
{
    CColor redColor = CColor(255,0,0,255);
    double radius, x, y, ptA, ptB;
    int ang = 0;
    
    
    while (ang<360) {
        
        switch (stereo_mode) {
            case 0:
            {
                radius = fabs(pattern+(1-pattern)*(cos((ang-width)/180.0*M_PI))) * size.getHeight()/2*0.8;
                break;
            }
            case 1:
            {
                ptA = cos(width/180.0*M_PI) * (pattern + (1-pattern)*(cos(ang/180.0*M_PI)));
                ptB = sin(width/180.0*M_PI) * (sin(ang/180.0*M_PI));
                
                radius = fabs(ptA + ptB) * size.getHeight()/2*0.8;
                break;
            }
                
            default:
                break;
        }
        

        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
        
        context->beginDraw();
        CPoint point = CPoint((int)x, (int)y);
        context->drawPoint(point, redColor);
        context->endDraw();
        
        ang++;
    }
};


void polarPlot::rightMicPattern(CDrawContext* context)
{
    CColor blueColor = CColor(0,0,255,255);
    double radius, x, y, ptA, ptB;
    int ang = 0;
    
    while (ang<360) {
        
        switch (stereo_mode) {
            case 0:
            {
                radius = fabs(pattern+(1-pattern)*(cos((ang+width)/180.0*M_PI))) * size.getHeight()/2*0.8;
                break;
            }
            case 1:
            {
                ptA = cos(width/180.0*M_PI) * (pattern + (1-pattern)*(cos(ang/180.0*M_PI)));
                ptB = sin(width/180.0*M_PI) * (sin(ang/180.0*M_PI));
                
                radius = fabs(ptA - ptB) * size.getHeight()/2*0.8;
                break;
            }
                
            default:
                break;
        }

        
        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
        
        context->beginDraw();
        CPoint point = CPoint((int)x, (int)y);
        context->drawPoint(point, blueColor);
        context->endDraw();
        
        ang++;
    }
};
    


void polarPlot::centreMicPattern(CDrawContext* context)
{
    CColor yellowColor = CColor(255,215,0,255);
    double radius, x, y;
    int ang = 0;
    
    while (ang<360) {
        radius = fabs(centre_pattern+(1-centre_pattern)*(cos((ang)/180.0*M_PI))) * size.getHeight()/2*0.8;

        x = size.getCenter().x - (sin(ang/180.0*M_PI)*(radius*(pow(10,centre_gain/gFactor/20))));
        y = size.getCenter().y - (cos(ang/180.0*M_PI)*(radius*(pow(10,centre_gain/gFactor/20))));
        
        context->beginDraw();
        CPoint point = CPoint((int)x, (int)y);
        context->drawPoint(point, yellowColor);
        context->endDraw();
        
        ang++;
    }
};





void polarPlot::lsMicPattern(CDrawContext* context)
{
    CColor greenColor = CColor(0,255,0,255);
    double radius, x, y, ptA, ptB;
    int ang = 0;
    
    while (ang<360) {
        switch (surround_mode) {
            case 0:
            {
                radius = fabs(surround_pattern+(1-surround_pattern)*(cos((ang-surround_width-180)/180.0*M_PI))) * size.getHeight()/2*0.8;
                break;
            }
            case 1:
            {
                ptA = cos(surround_width/180.0*M_PI) * (surround_pattern + (1-surround_pattern)*(cos((ang-180)/180.0*M_PI)));
                ptB = sin(surround_width/180.0*M_PI) * (sin((ang-180)/180.0*M_PI));
                
                radius = fabs(ptA + ptB) * size.getHeight()/2*0.8;
                break;
            }
                
            default:
                break;
        }
        
        
        
        x = size.getCenter().x + (sin(ang/180.0*M_PI)*(radius*(pow(10,surround_gain/gFactor/20))));
        y = size.getCenter().y - (cos(ang/180.0*M_PI)*(radius*(pow(10,surround_gain/gFactor/20))));
        
        context->beginDraw();
        CPoint point = CPoint((int)x, (int)y);
        context->drawPoint(point, greenColor);
        context->endDraw();
        
        ang++;
    }
};


void polarPlot::rsMicPattern(CDrawContext* context)
{
    CColor brownColor = CColor(139,69,19,255);
    double radius, x, y, ptA, ptB;
    int ang = 0;
    
    while (ang<360) {
        switch (surround_mode) {
            case 0:
            {
                radius = fabs(surround_pattern+(1-surround_pattern)*(cos((ang-180+surround_width)/180.0*M_PI))) * size.getHeight()/2*0.8;
                break;
            }
            case 1:
            {
                ptA = cos(surround_width/180.0*M_PI) * (surround_pattern + (1-surround_pattern)*(cos((ang-180)/180.0*M_PI)));
                ptB = sin(surround_width/180.0*M_PI) * (sin((ang-180)/180.0*M_PI));
                
                radius = fabs(ptA - ptB) * size.getHeight()/2*0.8;
                break;
            }
                
            default:
                break;
        }
        
        x = size.getCenter().x + (sin(ang/180.0*M_PI)*(radius*(pow(10,surround_gain/gFactor/20))));
        y = size.getCenter().y - (cos(ang/180.0*M_PI)*(radius*(pow(10,surround_gain/gFactor/20))));
        
        context->beginDraw();
        CPoint point = CPoint((int)x, (int)y);
        context->drawPoint(point, brownColor);
        context->endDraw();
        
        ang++;
    }
};


void polarPlot::heller1Pattern(VSTGUI::CDrawContext *context)
{
    double radius, x, y;
    int ang = 0;
    
    //Left Polar
    CColor redColor = CColor(255,0,0,255);
    while (ang<360) {
        radius = 1.4017195157709*fabs(0.28205165*(1/sqrt(2.0)) +0.24760232*(cos(ang/180.0*M_PI)) +0.18790454*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;

        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
        
        context->beginDraw();
        CPoint point = CPoint((int)x, (int)y);
        context->drawPoint(point, redColor);
        context->endDraw();
        
        ang++;
    }

    //Right Polar
    CColor blueColor = CColor(0,0,255,255);
    ang = 0;
    while (ang<360) {
        radius = 1.4017195157709*fabs(0.28204229*(1/sqrt(2.0)) +0.24758662*(cos(ang/180.0*M_PI)) -0.18792311*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;

        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
        
        context->beginDraw();
        CPoint point = CPoint((int)x, (int)y);
        context->drawPoint(point, blueColor);
        context->endDraw();
        
        ang++;
    }

    
    //SL Polar Pattern
    CColor greenColor = CColor(0,255,0,255);
    ang = 0;
    while (ang<360) {
        radius = 1.40171951577099*fabs(0.44947336*(1/sqrt(2.0)) -0.23381746*(cos(ang/180.0*M_PI)) +0.31911519*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
        
        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
        
        context->beginDraw();
        CPoint point = CPoint((int)x, (int)y);
        context->drawPoint(point, greenColor);
        context->endDraw();
        
        ang++;
    }
    
    //SR Polar Pattern
    CColor brownColor = CColor(139,69,19,255);
    ang = 0;
    while (ang<360) {
        radius = 1.4017195157709*fabs(0.44945895*(1/sqrt(2.0)) -0.23380219*(cos(ang/180.0*M_PI)) -0.31911386*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
        
        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
        
        context->beginDraw();
        CPoint point = CPoint((int)x, (int)y);
        context->drawPoint(point, brownColor);
        context->endDraw();
        
        ang++;
    }
    
    //C Polar Pattern
    CColor yellowColor = CColor(255,215,0,255);
    ang = 0;
    while (ang<360) {
        radius = 1.4017195157709*fabs(-0.04881270*(1/sqrt(2.0)) -0.02756928*(cos(ang/180.0*M_PI)) +0.00001724*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
        
        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
        
        context->beginDraw();
        CPoint point = CPoint((int)x, (int)y);
        context->drawPoint(point, yellowColor);
        context->endDraw();
        
        ang++;
    }
};


void polarPlot::heller2Pattern(VSTGUI::CDrawContext *context)
{
    double radius, x, y;
    int ang = 0;
    
    //Left Polar
    CColor redColor = CColor(255,0,0,255);
    while (ang<360) {
        radius = 1.38921598327229*fabs(0.21426224*(1/sqrt(2.0)) +0.19218459*(cos(ang/180.0*M_PI)) +0.20409261*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
        
        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
        
        context->beginDraw();
        CPoint point = CPoint((int)x, (int)y);
        context->drawPoint(point, redColor);
        context->endDraw();
        
        ang++;
    }
    
    //Right Polar
    CColor blueColor = CColor(0,0,255,255);
    ang = 0;
    while (ang<360) {
        radius = 1.38921598327229*fabs(0.21426400*(1/sqrt(2.0)) +0.19218379*(cos(ang/180.0*M_PI)) -0.20409362*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
        
        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
        
        context->beginDraw();
        CPoint point = CPoint((int)x, (int)y);
        context->drawPoint(point, blueColor);
        context->endDraw();
        
        ang++;
    }
    
    
    //SL Polar Pattern
    CColor greenColor = CColor(0,255,0,255);
    ang = 0;
    while (ang<360) {
        radius = 1.38921598327229*fabs(0.44287748*(1/sqrt(2.0)) -0.27006948*(cos(ang/180.0*M_PI)) +0.30405695*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
        
        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
        
        context->beginDraw();
        CPoint point = CPoint((int)x, (int)y);
        context->drawPoint(point, greenColor);
        context->endDraw();
        
        ang++;
    }
    
    //SR Polar Pattern
    CColor brownColor = CColor(139,69,19,255);
    ang = 0;
    while (ang<360) {
        radius = 1.38921598327229*fabs(0.44287676*(1/sqrt(2.0)) -0.27006941*(cos(ang/180.0*M_PI)) -0.30405595*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
        
        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
        
        context->beginDraw();
        CPoint point = CPoint((int)x, (int)y);
        context->drawPoint(point, brownColor);
        context->endDraw();
        
        ang++;
    }
    
    //C Polar Pattern
    CColor yellowColor = CColor(255,215,0,255);
    ang = 0;
    while (ang<360) {
        radius = 1.38921598327229*fabs(0.09993309*(1/sqrt(2.0)) +0.15577050*(cos(ang/180.0*M_PI)) +0.00000000*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
       
        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
        
        context->beginDraw();
        CPoint point = CPoint((int)x, (int)y);
        context->drawPoint(point, yellowColor);
        context->endDraw();
        
        ang++;
    }
};