Example #1
0
BOOL CbelaviewDoc::GetPointValues(double x, double y, int k, CPointVals &u)
{
	int i,n[3];
	double a[3],b[3],c[3],da,ravg;
	
	for(i=0;i<3;i++) n[i]=meshelem[k].p[i];
	a[0]=meshnode[n[1]].x * meshnode[n[2]].y - meshnode[n[2]].x * meshnode[n[1]].y;
	a[1]=meshnode[n[2]].x * meshnode[n[0]].y - meshnode[n[0]].x * meshnode[n[2]].y;
	a[2]=meshnode[n[0]].x * meshnode[n[1]].y - meshnode[n[1]].x * meshnode[n[0]].y;
	b[0]=meshnode[n[1]].y - meshnode[n[2]].y;
	b[1]=meshnode[n[2]].y - meshnode[n[0]].y;
	b[2]=meshnode[n[0]].y - meshnode[n[1]].y;	
	c[0]=meshnode[n[2]].x - meshnode[n[1]].x;
	c[1]=meshnode[n[0]].x - meshnode[n[2]].x;
	c[2]=meshnode[n[1]].x - meshnode[n[0]].x;
	da=(b[0]*c[1]-b[1]*c[0]);
	ravg=LengthConv[LengthUnits]*
		(meshnode[n[0]].x + meshnode[n[1]].x + meshnode[n[2]].x)/3.;
	
	GetPointD(x,y,u.D,meshelem[k]);
	u.e=blockproplist[meshelem[k].blk].ex+I*blockproplist[meshelem[k].blk].ey;
	u.e/=AECF(k,x+I*y);

	u.V=0;
	for(i=0;i<3;i++) u.V+=meshnode[n[i]].V*(a[i]+b[i]*x+c[i]*y)/(da);
	u.E.re = u.D.re/(u.e.re*eo);
	u.E.im = u.D.im/(u.e.im*eo);

	u.nrg=Re(u.D*conj(u.E))/2.;

	return TRUE;
}
Example #2
0
void FilterPoints2::GetPoints()
{
ofstream F1("c:\\5555.txt", fstream::app);
		DWORD k = 0;
		int n;
		//переводим точки во внутреннюю структуру   Lines
		for (int n = 0; n < Path->curve.n; n++)
		{
			if (Path->curve.tag[n] == POTRACE_CURVETO)
			{
				PointD startPoint = Path->curve.c[n ? n - 1 : Path->curve.n - 1][2];
				PointD UPoint = Path->curve.c[n][0];
				PointD WPoint = Path->curve.c[n][1];
				PointD endPoint = Path->curve.c[n][2];

				Lines.push_back(   PotraceLineCPP(startPoint, UPoint));
				Lines.push_back(   PotraceLineCPP(UPoint, WPoint));
				Lines.push_back(   PotraceLineCPP(WPoint, endPoint));
			}
			if (Path->curve.tag[n] == POTRACE_CORNER)
			{
				PointD startPoint = Path->curve.c[n ? n - 1 : Path->curve.n - 1][2];
				PointD vertexPoint = Path->curve.c[n][1];   //срединная точка
				PointD endPoint = Path->curve.c[n][2];

				Lines.push_back(   PotraceLineCPP(startPoint, vertexPoint));
				Lines.push_back(   PotraceLineCPP(vertexPoint, endPoint));
			}
		}

		//классификация линий
		//1 - линия параллельна X
		//2 - линия параллельна Y
		//0 - линия готова к удалению
		if (Lines.size() <= 1) return;
		for (k = 0; k < Lines.size(); k++)
		{
			if (isParallelX(Lines[k].Start, Lines[k].End)) Lines[k].tag = 1;
			else
				if (isParallelY(Lines[k].Start, Lines[k].End)) Lines[k].tag = 2;
		}

		//объединение линиий по классификации
		DWORD endI;
		k = 0;
		while (k < Lines.size()-1)
		{
			if (Lines[k].tag != 0)
			{
				endI = FindEndParallel(k + 1, Lines[k].tag);
				if (k != endI)
				{
					PotraceLineCPP L = GetEndPoints(Lines[k], Lines[endI]);
					Lines[k].Start = L.Start;
					Lines[k].End = L.End;
					RangeSetType( k + 1, endI, 0);
					k = endI;
				}
			}
			k++;
		}

		//Удаляем линии длины которых меньше указанной
		for (k = 0; k < Lines.size(); k++)
			if (Lines[k].tag != 0)
				if (GetDistance(Lines[k].Start, Lines[k].End) < MinLen) Lines[k].tag = 0;


for (k = 0; k < Lines.size(); k++)
//if (Lines[k].tag != 0)
{
//F1 << Lines[k].tag << endl;
//F1 << "Lines " << k << "    xStart=" << Lines[k].Start.x << endl;
//F1 << "Lines " << k << "    yStart=" << Lines[k].Start.y << endl;
//F1 << "Lines " << k << "    xEnd=" << Lines[k].End.x << endl;
//F1 << "Lines " << k << "    yEnd=" << Lines[k].End.y << endl;

F1 << Lines[k].Start.x << ";" << Lines[k].Start.y << ";" << Lines[k].End.x << ";" << Lines[k].End.y<< endl;
}


//Получаем все точки пересечения двух осей
		for (DWORD x = 0; x < Lines.size(); x++)
			if (Lines[x].tag == 1)
				for (DWORD y = 0; y < Lines.size(); y++)
					if (Lines[y].tag == 2)
					{
						Result.push_back(GetPointD(
						(Lines[y].Start.x + Lines[y].End.x) / 2,
						(Lines[x].Start.y + Lines[x].End.y) / 2));
					}

F1.close();
}