示例#1
0
ofVec2f closestPointOnEllipse(const cv::RotatedRect& ellipse, const ofVec2f& point) {
    ofVec2f norm = point;
    ofVec2f offset(ellipse.center.x, ellipse.center.y);
    norm -= offset;
    norm.rotate(-ellipse.angle);
    bool flipX = norm.x < 0, flipY = norm.y < 0;
    if(flipX) norm.x *= -1;
    if(flipY) norm.y *= -1;
    float e[] = {ellipse.size.width / 2, ellipse.size.height / 2};
    float y[] = {norm.x, norm.y};
    float x[2];
    DistancePointEllipse(e, y, x);
    ofVec2f result(x[0], x[1]);
    if(flipX) result.x *= -1;
    if(flipY) result.y *= -1;
    result.rotate(ellipse.angle);
    result += offset;
    return result;
    }
//----------------------------------------------------------------------------
void DistancePointEllipseEllipsoid::GenerateDistance2 (
    ImageDouble2D& distance)
{
    const int bound0 = distance.GetBound(0);
    const int bound1 = distance.GetBound(1);
    const double e[2] =
    {
        (double)bound0/4,
        (double)bound1/4
    };

    double y[2], x[2];
    for (int i1 = -bound1/2, j1 = 0; i1 < bound1/2; ++i1, ++j1)
    {
        y[1] = 4.0*e[1]*i1/bound1;
        for (int i0 = -bound0/2, j0 = 0; i0 < bound0/2; ++i0, ++j0)
        {
            y[0] = 4.0*e[0]*i0/bound0;
            distance(j0, j1) = DistancePointEllipse(e, y, x);
        }
    }
}
示例#3
0
int Lattice::drawTorus(int f, double centerX, double centerY, double centerZ, double angleStart, double angleEnd, double radiusX, double radiusY, double radius, double rotationX, double rotationY, double rotationZ, double rotationAngleX, double rotationAngleY, double rotationAngleZ, int r, int g, int b)
{
	int p;
	int x,y,z;
	int i,j,k;
	p=0;
	if (f>=frameCount)
		return LATTICE_ERROR_WRONG_FRAME;

	double canvasX;
	double canvasY;
	double canvasZ;

	double canvasTempX;
	double canvasTempY;
	double canvasTempZ;

	int iterations;
	double ellipseX;
	double ellipseY;

	double dd;

	double radius_sq;
	radius_sq=radius*radius;
	double ck;
	double canvasStep_sq;
	canvasStep_sq=canvasStep*canvasStep;
	double angle;

	for(i=0;i<sizeX;i++)
		for(j=0;j<sizeY;j++)
			for(k=0;k<sizeZ;k++)
			{
				canvasX=(i-sizeX/2+0.5)*canvasStep;
				canvasY=(j-sizeY/2+0.5)*canvasStep;
				canvasZ=(k-sizeZ/2+0.5)*canvasStep;


				canvasX=canvasX-rotationX;
				canvasY=canvasY-rotationY;
				canvasZ=canvasZ-rotationZ;

				canvasTempX=canvasX*geometryCos(rotationAngleZ)-canvasY*geometrySin(rotationAngleZ);
				canvasTempY=canvasX*geometrySin(rotationAngleZ)+canvasY*geometryCos(rotationAngleZ);
				canvasX=canvasTempX;
				canvasY=canvasTempY;

				canvasTempX=canvasX*geometryCos(rotationAngleY)+canvasZ*geometrySin(rotationAngleY);
				canvasTempZ=-canvasX*geometrySin(rotationAngleY)+canvasZ*geometryCos(rotationAngleY);
				canvasX=canvasTempX;
				canvasZ=canvasTempZ;

				canvasTempY=canvasY*geometryCos(rotationAngleX)-canvasZ*geometrySin(rotationAngleX);
				canvasTempZ=canvasY*geometrySin(rotationAngleX)+canvasZ*geometryCos(rotationAngleX);
				canvasY=canvasTempY;
				canvasZ=canvasTempZ;

				canvasX=canvasX+rotationX;
				canvasY=canvasY+rotationY;
				canvasZ=canvasZ+rotationZ;

				canvasX=canvasX-centerX;
				canvasY=canvasY-centerY;
				canvasZ=canvasZ-centerZ;

				DistancePointEllipse(canvasX, canvasY, radiusX, radiusY, 1e-08, 32, iterations, ellipseX, ellipseY);
				
				angle=geometryArcTan(ellipseX/abs(ellipseY));
				if (ellipseY>0)
					angle=90-angle;
				else
					angle=270+angle;
	
				if (((angleStart<=angleEnd)&(angle>=angleStart)&(angle<=angleEnd))|((angleStart>=angleEnd)&((angle>=angleStart)|(angle<=angleEnd))))
				{
					dd=sqrt((ellipseX-canvasX)*(ellipseX-canvasX)+(ellipseY-canvasY)*(ellipseY-canvasY)+(canvasZ)*(canvasZ));

					if (dd<radius)
					{
						if ((255-r)>frame[f].red[LATTICE_GET_PIXEL_ADDRESS(i,j,k)])
							frame[f].red[LATTICE_GET_PIXEL_ADDRESS(i,j,k)]+=r;
						else
							frame[f].red[LATTICE_GET_PIXEL_ADDRESS(i,j,k)]=255;
						if ((255-g)>frame[f].green[LATTICE_GET_PIXEL_ADDRESS(i,j,k)])
							frame[f].green[LATTICE_GET_PIXEL_ADDRESS(i,j,k)]+=g;
						else
							frame[f].green[LATTICE_GET_PIXEL_ADDRESS(i,j,k)]=255;
						if ((255-b)>frame[f].blue[LATTICE_GET_PIXEL_ADDRESS(i,j,k)])
							frame[f].blue[LATTICE_GET_PIXEL_ADDRESS(i,j,k)]+=b;
						else
							frame[f].blue[LATTICE_GET_PIXEL_ADDRESS(i,j,k)]=255;
					}
					else
						if (dd<(radius+canvasStep))
						{
							ck=1-(dd-radius)/canvasStep;
						if ((255-r*ck)>frame[f].red[LATTICE_GET_PIXEL_ADDRESS(i,j,k)])
							frame[f].red[LATTICE_GET_PIXEL_ADDRESS(i,j,k)]+=r*ck;
						else
							frame[f].red[LATTICE_GET_PIXEL_ADDRESS(i,j,k)]=255;
						if ((255-g*ck)>frame[f].green[LATTICE_GET_PIXEL_ADDRESS(i,j,k)])
							frame[f].green[LATTICE_GET_PIXEL_ADDRESS(i,j,k)]+=g*ck;
						else
							frame[f].green[LATTICE_GET_PIXEL_ADDRESS(i,j,k)]=255;
						if ((255-b*ck)>frame[f].blue[LATTICE_GET_PIXEL_ADDRESS(i,j,k)])
							frame[f].blue[LATTICE_GET_PIXEL_ADDRESS(i,j,k)]+=b*ck;
						else
							frame[f].blue[LATTICE_GET_PIXEL_ADDRESS(i,j,k)]=255;
						}
				}
			}
	return 0;
}