martin@0: // martin@0: // MyPlot.cpp martin@12: // ClassicAmbiDec martin@0: // martin@0: // Created by Martin Morrell on 25/06/2012. martin@0: // Copyright (c) 2012 __MyCompanyName__. All rights reserved. martin@0: // martin@0: martin@0: #include "MyPlot.h" martin@0: martin@0: martin@0: martin@7: martin@7: polarPlot::polarPlot(const CRect &size): CView (size) martin@6: { martin@7: stereo_mode = 0; martin@7: pattern = 0.5; martin@7: width = 45; martin@8: centre_pattern = 0.5; martin@8: centre_gain = 0; martin@8: surround_mode = 0; martin@8: surround_pattern = 0.5; martin@8: surround_width = 60; martin@8: surround_mode = 0; martin@9: decoder_mode = 0; martin@9: decoder_prev = 0; martin@7: }; martin@6: martin@6: martin@7: martin@7: martin@7: void polarPlot::draw (CDrawContext* context) martin@7: { martin@7: //Plot background circle martin@7: circle(context); martin@7: martin@8: martin@8: //Plot Needed Polar Patterns martin@8: switch (decoder_mode) { martin@8: case 2: martin@8: //Stereo Mic Patterns martin@8: leftMicPattern(context); martin@8: rightMicPattern(context); martin@8: break; martin@8: martin@8: case 3: martin@8: //2.1 Mic Patterns martin@8: leftMicPattern(context); martin@8: rightMicPattern(context); martin@8: break; martin@8: martin@8: case 4: martin@8: //Quad Mic Patterns martin@8: leftMicPattern(context); martin@8: rightMicPattern(context); martin@8: lsMicPattern(context); martin@8: rsMicPattern(context); martin@8: break; martin@8: martin@8: case 5: martin@9: switch (decoder_mode5x) { martin@9: case 0: martin@9: //5.0 Mic Patterns martin@9: leftMicPattern(context); martin@9: rightMicPattern(context); martin@9: centreMicPattern(context); martin@9: lsMicPattern(context); martin@9: rsMicPattern(context); martin@9: break; martin@9: case 1: martin@9: //Heller 1 Plot martin@9: heller1Pattern(context); martin@9: break; martin@9: case 2: martin@9: //Heller 2 Plot martin@9: heller2Pattern(context); martin@9: break; martin@9: martin@9: default: martin@9: break; martin@9: } martin@9: martin@8: break; martin@8: martin@8: case 6: martin@9: switch (decoder_mode5x) { martin@9: case 0: martin@9: //5.1 Mic Patterns martin@9: leftMicPattern(context); martin@9: rightMicPattern(context); martin@9: centreMicPattern(context); martin@9: lsMicPattern(context); martin@9: rsMicPattern(context); martin@9: break; martin@9: case 1: martin@9: //Heller 1 Plot martin@9: heller1Pattern(context); martin@9: break; martin@9: case 2: martin@9: //Heller 2 Plot martin@9: heller2Pattern(context); martin@9: break; martin@9: martin@9: default: martin@9: break; martin@9: } martin@8: break; martin@8: martin@8: martin@8: default: martin@8: break; martin@8: } martin@8: martin@7: setDirty(false); martin@0: }; martin@0: martin@0: martin@7: void polarPlot::circle(CDrawContext *context) martin@7: { martin@12: //Plot Ellipse - Background Circle martin@7: context->setLineWidth (3); martin@7: CColor eclColor = CColor(120,120,120,125); martin@7: context->setFrameColor(eclColor); martin@7: ; martin@7: 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); martin@7: context->drawEllipse(circleSize); martin@7: }; martin@0: martin@0: martin@7: martin@7: void polarPlot::leftMicPattern(CDrawContext* context) martin@7: { martin@7: CColor redColor = CColor(255,0,0,255); martin@7: double radius, x, y, ptA, ptB; martin@7: int ang = 0; martin@7: martin@7: martin@7: while (ang<360) { martin@7: martin@7: switch (stereo_mode) { martin@7: case 0: martin@7: { martin@7: radius = fabs(pattern+(1-pattern)*(cos((ang-width)/180.0*M_PI))) * size.getHeight()/2*0.8; martin@7: break; martin@7: } martin@7: case 1: martin@7: { martin@7: ptA = cos(width/180.0*M_PI) * (pattern + (1-pattern)*(cos(ang/180.0*M_PI))); martin@7: ptB = sin(width/180.0*M_PI) * (sin(ang/180.0*M_PI)); martin@7: martin@7: radius = fabs(ptA + ptB) * size.getHeight()/2*0.8; martin@7: break; martin@7: } martin@7: martin@7: default: martin@7: break; martin@7: } martin@7: martin@12: martin@9: x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius); martin@9: y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius); martin@7: martin@7: context->beginDraw(); martin@7: CPoint point = CPoint((int)x, (int)y); martin@7: context->drawPoint(point, redColor); martin@7: context->endDraw(); martin@7: martin@7: ang++; martin@7: } martin@7: }; martin@7: martin@7: martin@7: void polarPlot::rightMicPattern(CDrawContext* context) martin@7: { martin@7: CColor blueColor = CColor(0,0,255,255); martin@7: double radius, x, y, ptA, ptB; martin@7: int ang = 0; martin@7: martin@7: while (ang<360) { martin@7: martin@7: switch (stereo_mode) { martin@7: case 0: martin@7: { martin@7: radius = fabs(pattern+(1-pattern)*(cos((ang+width)/180.0*M_PI))) * size.getHeight()/2*0.8; martin@7: break; martin@7: } martin@7: case 1: martin@7: { martin@7: ptA = cos(width/180.0*M_PI) * (pattern + (1-pattern)*(cos(ang/180.0*M_PI))); martin@7: ptB = sin(width/180.0*M_PI) * (sin(ang/180.0*M_PI)); martin@7: martin@7: radius = fabs(ptA - ptB) * size.getHeight()/2*0.8; martin@7: break; martin@7: } martin@7: martin@7: default: martin@7: break; martin@7: } martin@7: martin@7: martin@8: x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius); martin@8: y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius); martin@7: martin@7: context->beginDraw(); martin@7: CPoint point = CPoint((int)x, (int)y); martin@7: context->drawPoint(point, blueColor); martin@7: context->endDraw(); martin@7: martin@8: ang++; martin@8: } martin@8: }; martin@8: martin@8: martin@8: martin@12: void polarPlot::centreMicPattern(CDrawContext* context) martin@8: { martin@9: CColor yellowColor = CColor(255,215,0,255); martin@8: double radius, x, y; martin@8: int ang = 0; martin@8: martin@8: while (ang<360) { martin@8: radius = fabs(centre_pattern+(1-centre_pattern)*(cos((ang)/180.0*M_PI))) * size.getHeight()/2*0.8; martin@8: martin@9: x = size.getCenter().x - (sin(ang/180.0*M_PI)*(radius*(pow(10,centre_gain/gFactor/20)))); martin@9: y = size.getCenter().y - (cos(ang/180.0*M_PI)*(radius*(pow(10,centre_gain/gFactor/20)))); martin@8: martin@8: context->beginDraw(); martin@8: CPoint point = CPoint((int)x, (int)y); martin@8: context->drawPoint(point, yellowColor); martin@8: context->endDraw(); martin@7: martin@7: ang++; martin@7: } martin@7: }; martin@8: martin@8: martin@8: martin@8: martin@8: martin@8: void polarPlot::lsMicPattern(CDrawContext* context) martin@8: { martin@8: CColor greenColor = CColor(0,255,0,255); martin@8: double radius, x, y, ptA, ptB; martin@8: int ang = 0; martin@7: martin@8: while (ang<360) { martin@8: switch (surround_mode) { martin@8: case 0: martin@8: { martin@8: radius = fabs(surround_pattern+(1-surround_pattern)*(cos((ang-surround_width-180)/180.0*M_PI))) * size.getHeight()/2*0.8; martin@8: break; martin@8: } martin@8: case 1: martin@8: { martin@8: ptA = cos(surround_width/180.0*M_PI) * (surround_pattern + (1-surround_pattern)*(cos((ang-180)/180.0*M_PI))); martin@8: ptB = sin(surround_width/180.0*M_PI) * (sin((ang-180)/180.0*M_PI)); martin@8: martin@8: radius = fabs(ptA + ptB) * size.getHeight()/2*0.8; martin@8: break; martin@8: } martin@8: martin@8: default: martin@8: break; martin@8: } martin@8: martin@8: martin@8: martin@9: x = size.getCenter().x + (sin(ang/180.0*M_PI)*(radius*(pow(10,surround_gain/gFactor/20)))); martin@9: y = size.getCenter().y - (cos(ang/180.0*M_PI)*(radius*(pow(10,surround_gain/gFactor/20)))); martin@8: martin@8: context->beginDraw(); martin@8: CPoint point = CPoint((int)x, (int)y); martin@8: context->drawPoint(point, greenColor); martin@8: context->endDraw(); martin@8: martin@8: ang++; martin@8: } martin@8: }; martin@7: martin@7: martin@8: void polarPlot::rsMicPattern(CDrawContext* context) martin@8: { martin@8: CColor brownColor = CColor(139,69,19,255); martin@8: double radius, x, y, ptA, ptB; martin@8: int ang = 0; martin@8: martin@8: while (ang<360) { martin@8: switch (surround_mode) { martin@8: case 0: martin@8: { martin@8: radius = fabs(surround_pattern+(1-surround_pattern)*(cos((ang-180+surround_width)/180.0*M_PI))) * size.getHeight()/2*0.8; martin@8: break; martin@8: } martin@8: case 1: martin@8: { martin@8: ptA = cos(surround_width/180.0*M_PI) * (surround_pattern + (1-surround_pattern)*(cos((ang-180)/180.0*M_PI))); martin@8: ptB = sin(surround_width/180.0*M_PI) * (sin((ang-180)/180.0*M_PI)); martin@8: martin@8: radius = fabs(ptA - ptB) * size.getHeight()/2*0.8; martin@8: break; martin@8: } martin@8: martin@8: default: martin@8: break; martin@8: } martin@8: martin@9: x = size.getCenter().x + (sin(ang/180.0*M_PI)*(radius*(pow(10,surround_gain/gFactor/20)))); martin@9: y = size.getCenter().y - (cos(ang/180.0*M_PI)*(radius*(pow(10,surround_gain/gFactor/20)))); martin@8: martin@8: context->beginDraw(); martin@8: CPoint point = CPoint((int)x, (int)y); martin@8: context->drawPoint(point, brownColor); martin@8: context->endDraw(); martin@8: martin@8: ang++; martin@8: } martin@8: }; martin@7: martin@7: martin@9: void polarPlot::heller1Pattern(VSTGUI::CDrawContext *context) martin@9: { martin@9: double radius, x, y; martin@9: int ang = 0; martin@9: martin@9: //Left Polar martin@9: CColor redColor = CColor(255,0,0,255); martin@9: while (ang<360) { martin@9: 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; martin@7: martin@9: x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius); martin@9: y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius); martin@9: martin@9: context->beginDraw(); martin@9: CPoint point = CPoint((int)x, (int)y); martin@9: context->drawPoint(point, redColor); martin@9: context->endDraw(); martin@9: martin@9: ang++; martin@9: } martin@7: martin@9: //Right Polar martin@9: CColor blueColor = CColor(0,0,255,255); martin@9: ang = 0; martin@9: while (ang<360) { martin@9: 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; martin@9: martin@9: x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius); martin@9: y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius); martin@9: martin@9: context->beginDraw(); martin@9: CPoint point = CPoint((int)x, (int)y); martin@9: context->drawPoint(point, blueColor); martin@9: context->endDraw(); martin@9: martin@9: ang++; martin@9: } martin@9: martin@9: martin@9: //SL Polar Pattern martin@9: CColor greenColor = CColor(0,255,0,255); martin@9: ang = 0; martin@9: while (ang<360) { martin@9: 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; martin@9: martin@9: x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius); martin@9: y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius); martin@9: martin@9: context->beginDraw(); martin@9: CPoint point = CPoint((int)x, (int)y); martin@9: context->drawPoint(point, greenColor); martin@9: context->endDraw(); martin@9: martin@9: ang++; martin@9: } martin@9: martin@9: //SR Polar Pattern martin@9: CColor brownColor = CColor(139,69,19,255); martin@9: ang = 0; martin@9: while (ang<360) { martin@9: 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; martin@9: martin@9: x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius); martin@9: y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius); martin@9: martin@9: context->beginDraw(); martin@9: CPoint point = CPoint((int)x, (int)y); martin@9: context->drawPoint(point, brownColor); martin@9: context->endDraw(); martin@9: martin@9: ang++; martin@9: } martin@9: martin@9: //C Polar Pattern martin@9: CColor yellowColor = CColor(255,215,0,255); martin@9: ang = 0; martin@9: while (ang<360) { martin@9: 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; martin@9: martin@9: x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius); martin@9: y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius); martin@9: martin@9: context->beginDraw(); martin@9: CPoint point = CPoint((int)x, (int)y); martin@9: context->drawPoint(point, yellowColor); martin@9: context->endDraw(); martin@9: martin@9: ang++; martin@9: } martin@9: }; martin@9: martin@9: martin@9: void polarPlot::heller2Pattern(VSTGUI::CDrawContext *context) martin@9: { martin@9: double radius, x, y; martin@9: int ang = 0; martin@9: martin@9: //Left Polar martin@9: CColor redColor = CColor(255,0,0,255); martin@9: while (ang<360) { martin@9: 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; martin@9: martin@9: x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius); martin@9: y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius); martin@9: martin@9: context->beginDraw(); martin@9: CPoint point = CPoint((int)x, (int)y); martin@9: context->drawPoint(point, redColor); martin@9: context->endDraw(); martin@9: martin@9: ang++; martin@9: } martin@9: martin@9: //Right Polar martin@9: CColor blueColor = CColor(0,0,255,255); martin@9: ang = 0; martin@9: while (ang<360) { martin@9: 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; martin@9: martin@9: x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius); martin@9: y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius); martin@9: martin@9: context->beginDraw(); martin@9: CPoint point = CPoint((int)x, (int)y); martin@9: context->drawPoint(point, blueColor); martin@9: context->endDraw(); martin@9: martin@9: ang++; martin@9: } martin@9: martin@9: martin@9: //SL Polar Pattern martin@9: CColor greenColor = CColor(0,255,0,255); martin@9: ang = 0; martin@9: while (ang<360) { martin@9: 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; martin@9: martin@9: x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius); martin@9: y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius); martin@9: martin@9: context->beginDraw(); martin@9: CPoint point = CPoint((int)x, (int)y); martin@9: context->drawPoint(point, greenColor); martin@9: context->endDraw(); martin@9: martin@9: ang++; martin@9: } martin@9: martin@9: //SR Polar Pattern martin@9: CColor brownColor = CColor(139,69,19,255); martin@9: ang = 0; martin@9: while (ang<360) { martin@9: 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; martin@9: martin@9: x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius); martin@9: y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius); martin@9: martin@9: context->beginDraw(); martin@9: CPoint point = CPoint((int)x, (int)y); martin@9: context->drawPoint(point, brownColor); martin@9: context->endDraw(); martin@9: martin@9: ang++; martin@9: } martin@9: martin@9: //C Polar Pattern martin@9: CColor yellowColor = CColor(255,215,0,255); martin@9: ang = 0; martin@9: while (ang<360) { martin@9: 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; martin@9: martin@9: x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius); martin@9: y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius); martin@9: martin@9: context->beginDraw(); martin@9: CPoint point = CPoint((int)x, (int)y); martin@9: context->drawPoint(point, yellowColor); martin@9: context->endDraw(); martin@9: martin@9: ang++; martin@9: } martin@9: }; martin@9: