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; }
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(); }