You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
3.7 KiB

/** @file */
/* The MIT License
*
* Copyright (c) 2008, Naotoshi Seo <sonots(at)sonots.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef CV_RECT32FPOINTS_INCLUDED
#define CV_RECT32FPOINTS_INCLUDED
#include "cv.h"
#include "cvaux.h"
#include "cxcore.h"
#include "cvrect32f.h"
#include "cvcreateaffine.h"
// CVAPI(void) cvRect32fPoints( CvRect32f rect, CvPoint2D32f pt[4],
// CvPoint2D32f shear = cvPoint2D32f(0,0) );
// CV_INLINE void cvBox32fPoints( CvBox32f box, CvPoint2D32f pt[4],
// CvPoint2D32f shear = cvPoint2D32f(0,0) );
// CV_INLINE void cvRectPoints( CvRect rect, CvPoint2D32f pt[4] );
// cvBoxPoints
/**
* Find 4 corners of rectangle
*
* @code
* x y
* [0] 0 0
* [1] 1 0
* [2] 1 1
* [3] 0 1
* @endcode
*
* @param rect Rectangle parameters and rotation angle parameter
* @param pt[4] Found 4 corners
* @param shear Shear deformation parameter if you want
* @see cvBoxPoints, cvBox32fPoints, cvRectPoints, cvRect32fPoints
*/
CVAPI(void) cvRect32fPoints( CvRect32f rect, CvPoint2D32f pt[4],
CvPoint2D32f shear CV_DEFAULT(cvPoint2D32f(0,0)) )
{
if( shear.x == 0 && shear.y == 0 )
{
CvBox2D box2d = cvBox2DFromRect32f( rect );
cvBoxPoints( box2d, pt );
}
else
{
CvMat* A = cvCreateMat( 2, 3, CV_32FC1 );
cvCreateAffine( A, rect, shear );
pt[0].x = 0; pt[0].y = 0;
pt[1].x = 1; pt[1].y = 0;
pt[2].x = 1; pt[2].y = 1;
pt[3].x = 0; pt[3].y = 1;
CvPoint2D32f tmp;
for( int i = 0; i < 4; i++ )
{
tmp.x = cvmGet( A, 0, 0 ) * pt[i].x + cvmGet( A, 0, 1 ) * pt[i].y + cvmGet( A, 0, 2 );
tmp.y = cvmGet( A, 1, 0 ) * pt[i].x + cvmGet( A, 1, 1 ) * pt[i].y + cvmGet( A, 1, 2 );
pt[i].x = tmp.x;
pt[i].y = tmp.y;
}
}
}
/**
* Find 4 corners of box
*
* @code
* x y
* [0] 0 0
* [1] 1 0
* [2] 1 1
* [3] 0 1
* @endcode
*
* @param box Box structure
* @param pt[4] Found 4 corners
* @param shear Shear deformation parameters if you want
* @see cvBoxPoints, cvBox32fPoints, cvRectPoints, cvRect32fPoints
*/
CV_INLINE void cvBox32fPoints( CvBox32f box, CvPoint2D32f pt[4],
CvPoint2D32f shear CV_DEFAULT(cvPoint2D32f(0,0)) )
{
cvRect32fPoints( cvRect32fFromBox32f( box ), pt, shear );
}
/**
* Find 4 corners of rectangle
*
* @code
* x y
* [0] 0 0
* [1] 1 0
* [2] 1 1
* [3] 0 1
* @endcode
*
* @param rect Rectangle parameter
* @param pt[4] Found 4 points
* @see cvBoxPoints, cvBox32fPoints, cvRectPoints, cvRect32fPoints
*/
CV_INLINE void cvRectPoints( CvRect rect, CvPoint2D32f pt[4] )
{
cvRect32fPoints( cvRect32fFromRect( rect ), pt );
}
#endif