⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 common.c

📁 jiance jichang paidui de moxing.
💻 C
字号:
/**
* @file common.c
* @brief
* Copyright (c) 2007,SICE
* All rights reserved.
*
* 揈梫丗嫟捠僼傽僋僔儑儞
*
* Ver : 0.1
* 嶌幰 : 錖愯摀
* 峏怴帪娫 : 2007/11/15
*/
#include "common.h"

/**
 * @fn cmPutText
 * 
 * @brief
 * 揈梫丗夋憸偵暥帤傪弌椡偡傞丅
 *
 * @param[in] argImg 夋憸
 * @param[in] argText 暥帤撪梕
 * @param[in] argLoc 弌椡埵抲
 * @param[in] argRgb 僇儔乕
 * 
 * @return void
 */
void cmPutText(IplImage *argImg, char *argText, CvPoint argLoc, CvScalar argRgb)
{
	CvFont font;
	cvInitFont( &font, CV_FONT_HERSHEY_SIMPLEX, 0.3f, 0.3f, 0, 1, 12);//CV_FONT_VECTORO,CV_FONT_HERSHEY_SIMPLEX

	cvPutText(argImg, argText, argLoc, &font, argRgb);
}

/**
 * @fn cmCvtFloatToStr
 * 
 * @brief
 * 揈梫丗Convert float to string丅
 *
 * @param[in] fVal 
 * @param[in] iNdigits 彫悢埵悢
 * 
 * @return string of fval
 */
char * cmCvtFloatToStr(float fVal, int iNdigits, char *buff)
{
	char *ptr;

	ptr = gcvt(fVal, iNdigits, buff);

	return ptr;
}

CmLine cmLine(CvPoint pt1, CvPoint pt2)
{
	CmLine line = {pt1.x,pt1.y, pt2.x,pt2.y, 0.0, NULL, NULL};
	return line;
}

/**
 * @fn cmReleaseCmLines
 * 
 * @brief
 * 揈梫丗Release the space of pCmLines.
 * 
 * @param[in] pCmLines
 *
 * @return void
 */
void cmReleaseCmLines(CmLine **ppCmLines)
{
	CmLine *pTemp = NULL;
	CmLine *pLine = *ppCmLines;

	while(pLine)
	{
		pTemp = pLine->next;
		free(pLine);
		pLine = pTemp;
	}

	*ppCmLines = NULL;
}

/*
 *悢妛岞幃寁嶼
 *
 */

float cmCalDistanceOfPointToLine(CvPoint pt, CmLine line)
{
	/*
	*L: Ax + By + C = 0
	*d: abs(Axo + Byo + C) / sqrt(A*A + B*B)
	*/
	float A, B, C;
	float d;

	A = (float)(line.pt1.y-line.pt2.y);
	B = (float)(line.pt2.x-line.pt1.x);
	C = line.pt1.x*line.pt2.y - line.pt2.x*line.pt1.y;

	d = abs(A*pt.x + B*pt.y + C);
	d = d / sqrt(A*A+B*B);

	return d;
}

int cmCalCoordinateYWithX(int iX, CmLine line)
{
	float fCodY;
	int iY;

	fCodY = (line.pt2.x*line.pt1.y - line.pt1.x*line.pt2.y -
							(line.pt1.y-line.pt2.y)*iX) / (line.pt2.x-line.pt1.x);
	iY = (int)(fCodY+0.5);

	return iY;
}

CvPoint cmCalIntersectionOfTwoLines(CmLine *line1, CmLine *line2, int iIsRelInsec)
{
	float fXo, fYo;
	CvPoint ptInsec;

	if((line1->pt1.x == line1->pt2.x && line2->pt1.x == line2->pt2.x) || 
		(line1->pt1.y == line1->pt2.y && line2->pt1.y == line2->pt2.y))
	{
		ptInsec.x = ptInsec.y = -1;
		return ;
	}

	fYo = (line1->pt2.x*line1->pt1.y - line1->pt1.x*line1->pt2.y)*(line2->pt1.y-line2->pt2.y);

	fYo = fYo - (line2->pt2.x*line2->pt1.y - line2->pt1.x*line2->pt2.y)*(line1->pt1.y-line1->pt2.y);

	fYo = fYo / ((line1->pt2.x-line1->pt1.x)*(line2->pt1.y-line2->pt2.y)-(line2->pt2.x-line2->pt1.x)*(line1->pt1.y-line1->pt2.y));

	fXo = line1->pt2.x*line1->pt1.y-line1->pt1.x*line1->pt2.y - fYo *(line1->pt2.x-line1->pt1.x);

	fXo = fXo / (line1->pt1.y - line1->pt2.y);

	ptInsec.x = (int)(fXo + 0.5);

	ptInsec.y = (int)(fYo + 0.5);

	if(iIsRelInsec == 1)
	{
		if(line1->pt1.x > ptInsec.x || ptInsec.x > line1->pt2.x || 
			line2->pt1.x > ptInsec.x || ptInsec.x > line2->pt2.x)
		{
			ptInsec.x = ptInsec.y = -1;
		}
	}

	return ptInsec;
}

int cmIsTwoPointsAtSameSizeOfLine(CvPoint pt1, CvPoint pt2, CmLine line)
{
	CmLine line2 = cmLine(pt1,pt2);

	CvPoint ptInsec = cmCalIntersectionOfTwoLines(&line, &line2, 0);

	if(ptInsec.x > pt1.x && ptInsec.x < pt2.x || ptInsec.x > pt2.x && ptInsec.x < pt1.x)
	{
		return 0;
	}

	return 1;
}

int cmIsPointInsideOfSphere(CvPoint pt, CvPoint pt1, CvPoint pt2, CvPoint pt3, CvPoint pt4)
{
	int isSameSide = 0;

	isSameSide = cmIsTwoPointsAtSameSizeOfLine(pt, pt1, cmLine(pt2,pt4));

	if(isSameSide == 0)
	{
		return 0;
	}

	isSameSide = cmIsTwoPointsAtSameSizeOfLine(pt, pt1, cmLine(pt3,pt4));

	if(isSameSide == 0)
	{
		return 0;
	}

	isSameSide = cmIsTwoPointsAtSameSizeOfLine(pt, pt2, cmLine(pt1,pt3));

	if(isSameSide == 0)
	{
		return 0;
	}

	isSameSide = cmIsTwoPointsAtSameSizeOfLine(pt, pt2, cmLine(pt3,pt4));

	if(isSameSide == 0)
	{
		return 0;
	}

	isSameSide = cmIsTwoPointsAtSameSizeOfLine(pt, pt3, cmLine(pt1,pt2));

	if(isSameSide == 0)
	{
		return 0;
	}

	isSameSide = cmIsTwoPointsAtSameSizeOfLine(pt, pt3, cmLine(pt2,pt4));

	if(isSameSide == 0)
	{
		return 0;
	}

	isSameSide = cmIsTwoPointsAtSameSizeOfLine(pt, pt4, cmLine(pt1,pt2));

	if(isSameSide == 0)
	{
		return 0;
	}

	isSameSide = cmIsTwoPointsAtSameSizeOfLine(pt, pt4, cmLine(pt1,pt3));

	if(isSameSide == 0)
	{
		return 0;
	}

	return 1;
}


void cmTestShowImage(IplImage * pImg, char *win)
{
	if(win==NULL || pImg==NULL)
	{
		return;
	}

	cvNamedWindow(win, 1);
	cvShowImage(win, pImg);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -