Vector2d leastSquaresEstimate(vector<Vector2f> points, Vector2f p0, Vector2f p3, Vector2d d1, Vector2d d2) { // hack up points if(points.size() <= 10) points = interpolatePoints(points); if(points.size() <= 20) points = interpolatePoints(points); qDebug() << "num points in arc" << points.size(); int m = points.size()-2; // number of points to fit int n = 2; // number of control points to find Eigen::MatrixXd Z(m, n); Eigen::MatrixXd Y(m, n); Eigen::VectorXd pu(m); Eigen::VectorXd pv(m); for(int i = 0; i < m; ++i) { int idx = i+1; Vector2f pt = points[idx]; double t = double(idx)/(m-1); auto b0 = Bernstein3(0, t); auto b1 = Bernstein3(1, t); auto b2 = Bernstein3(2, t); auto b3 = Bernstein3(3, t); // Filling in the matrices Z(i, 0) = b1*d1[0]; Z(i, 1) = b2*d2[0]; Y(i, 0) = b1*d1[1]; Y(i, 1) = b2*d2[1]; auto pp = pt - p0*(b0 + b1) - p3*(b2 + b3); pu(i) = pp[0]; pv(i) = pp[1]; } auto Zt = Z.transpose(); auto Yt = Y.transpose(); auto A = Zt*Z+Yt*Y; auto rhs = Zt*pu+Yt*pv; Eigen::VectorXd ans = A.inverse()*rhs; auto s = makeVector2d(ans(0), ans(1)); qDebug() << "least squares" << s[0] << s[1]; s[0]=fabs(s[0])/**10*/; s[1]=fabs(s[1]); return s; }
void KoProgressUpdaterTest::testThreadedRecursiveProgress() { TestProgressBar bar; KoProgressUpdater pu(&bar); pu.start(); QPointer<KoUpdater> u1 = pu.startSubtask(); KoProgressUpdater pu2(u1); pu2.start(); QPointer<KoUpdater> u2 = pu2.startSubtask(); TestJob t1(u2); t1.start(); while (t1.isRunning() ) { QTest::qSleep(WAIT_FOR_PROGRESSUPDATER_UI_UPDATES); // allow the action to do its job. QCoreApplication::processEvents(); // allow the actions 'gui' stuff to run. } while(bar.value < 100) { QCoreApplication::processEvents(); QTest::qSleep(WAIT_FOR_PROGRESSUPDATER_UI_UPDATES); } QCOMPARE(bar.value, 100); }
void KisTransformWorkerTest::testIdentity() { TestUtil::TestProgressBar bar; KoProgressUpdater pu(&bar); KoUpdaterPtr updater = pu.startSubtask(); const KoColorSpace * cs = KoColorSpaceRegistry::instance()->rgb8(); QImage image(QString(FILES_DATA_DIR) + QDir::separator() + "mirror_source.png"); KisPaintDeviceSP dev = new KisPaintDevice(cs); dev->convertFromQImage(image, ""); KisFilterStrategy * filter = new KisBoxFilterStrategy(); KisTransaction t("test", dev); KisTransformWorker tw(dev, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, updater, filter, true); tw.run(); t.end(); QRect rc = dev->exactBounds(); QVERIFY(rc.width() ==image.width()); QVERIFY(rc.height() == image.height()); QImage result = dev->convertToQImage(0, rc.x(), rc.y(), rc.width(), rc.height()); QPoint errpoint; if (!TestUtil::compareQImages(errpoint, image, result)) { image.save("test_identity_source.png"); result.save("test_identity_result.png"); QFAIL(QString("Failed to apply identity transformation to image, first different pixel: %1,%2 \n").arg(errpoint.x()).arg(errpoint.y()).toAscii()); } }
void NurbsSurfaceSP<T,N>::modOnlySurfCPby(int i, int j, const HPoint_nD<T,N>& a){ int sizeU, sizeV ; sizeU = 2*this->degU+3 ; if(i-this->degU-1<0) sizeU += i-this->degU-1 ; if(i+this->degU+1>=this->P.rows()) sizeU -= i+this->degU+1-this->P.rows() ; sizeV = 2*this->degV+3 ; if(j-this->degV-1<0) sizeV += j-this->degV-1 ; if(j+this->degV+1>=this->P.cols()) sizeV -= j+this->degV+1-this->P.cols() ; Vector<T> u(sizeU) ; Vector<T> v(sizeV) ; Vector<Point_nD<T,N> > pts(sizeU*sizeV) ; Vector<int> pu(sizeU*sizeV) ; Vector<int> pv(sizeU*sizeV) ; int n=0; int nu = 0 ; int nv = 0 ; for(int k=i-this->degU-1;k<=i+this->degU+1;++k){ if(k<0) continue ; if(k>=this->P.rows()) break ; nv = 0 ; for(int l=j-this->degV-1;l<=j+this->degV+1;++l){ if(l<0) continue ; if(l>=this->P.cols()) break ; if( k == i && j==l){ pts[n].x() = a.x() ; pts[n].y() = a.y() ; pts[n].z() = a.z() ; } //else //pts[n] = Point3D(0,0,0) ; pu[n] = nu ; pv[n] = nv ; if(k==i){ v[nv] = maxAtV_[l] ; // only need to initialise this once } ++n ; ++nv ; } u[nu] = maxAtU_[k] ; ++nu ; } u.resize(nu) ; v.resize(nv) ; pts.resize(n) ; pu.resize(n) ; pv.resize(n) ; movePoint(u,v,pts,pu,pv) ; }
int main() { char catc[1024]; while(scanf("%s", catc)){ pu(catc); printf("%s ", catc);} return 0; }
static void units(struct unit *up) { register struct unit *p; register int f, i; p = up; printf("\t%e ", p->factor); f = 0; for(i=0; i<NDIM; i++) f |= pu(p->dim[i], i, f); if(f&1) { putchar('/'); f = 0; for(i=0; i<NDIM; i++) f |= pu(-p->dim[i], i, f); } putchar('\n'); }
static inline void _processRODataMsg(envelope *env) { //Unpack each readonly: if(!CmiMyRank()) { PUP::fromMem pu((char *)EnvToUsr(env)); for(size_t i=0;i<_readonlyTable.size();i++) { _readonlyTable[i]->pupData(pu); } } CmiFree(env); }
void KisTransformWorkerTest::testXScaleDown() { TestUtil::TestProgressBar bar; KoProgressUpdater pu(&bar); KoUpdaterPtr updater = pu.startSubtask(); const KoColorSpace * cs = KoColorSpaceRegistry::instance()->rgb8(); QImage image(QString(FILES_DATA_DIR) + QDir::separator() + "mirror_source.png"); KisPaintDeviceSP dev = new KisPaintDevice(cs); dev->convertFromQImage(image, ""); KisFilterStrategy * filter = new KisBoxFilterStrategy(); KisTransaction t("test", dev); KisTransformWorker tw(dev, 0.123, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, updater, filter, true); tw.run(); t.end(); QRect rc = dev->exactBounds(); QVERIFY(rc.width() == qRound(image.width() * 0.123)); QVERIFY(rc.height() == image.height() - 1); // the height is reduced by 1 because in the source image // at the bottom line most pixels (except 1 or 2) are // entirely transparent. // when scaling down the image by ~ 1/10, the few non-tranparent // pixels disappear when "mixed" with the transparent ones // around // KisTransaction t2("test", dev); // KisRandomAccessorSP ac = dev->createRandomAccessorNG(rc.x(), rc.y()); // for(int x = rc.x(); x < rc.width(); ++x) { // for(int y = rc.y(); y < rc.height(); ++y) { // ac->moveTo(x, y); // cs->setOpacity(ac->rawData(), 0.5, 1); // } // } // t2.end(); QImage result = dev->convertToQImage(0, rc.x(), rc.y(), rc.width(), rc.height()); QPoint errpoint; image.load(QString(FILES_DATA_DIR) + QDir::separator() + "scaledownx_result.png"); if (!TestUtil::compareQImages(errpoint, image, result)) { image.save("scaledownx_source.png"); result.save("scaledownx_result.png"); QFAIL(QString("Failed to scale down the image, first different pixel: %1,%2 \n").arg(errpoint.x()).arg(errpoint.y()).toAscii()); } }
void KisTransformWorkerTest::testCreation() { TestUtil::TestProgressBar bar; KoProgressUpdater pu(&bar); KoUpdaterPtr updater = pu.startSubtask(); const KoColorSpace * cs = KoColorSpaceRegistry::instance()->rgb8(); KisFilterStrategy * filter = new KisBoxFilterStrategy(); KisPaintDeviceSP dev = new KisPaintDevice(cs); KisTransformWorker tw(dev, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.5, 0, 0, updater, filter, true); }
void KoProgressUpdaterTest::testSimpleProgress() { TestProgressBar bar; KoProgressUpdater pu(&bar); pu.start(); QPointer<KoUpdater> updater = pu.startSubtask(); updater->setProgress(50); QTest::qSleep(WAIT_FOR_PROGRESSUPDATER_UI_UPDATES); // allow the action to do its job. QCoreApplication::processEvents(); // allow the actions 'gui' stuff to run. updater->setProgress(100); QTest::qSleep(WAIT_FOR_PROGRESSUPDATER_UI_UPDATES); // allow the action to do its job. QCoreApplication::processEvents(); // allow the actions 'gui' stuff to run. QCOMPARE(bar.value, 100); }
void KoProgressUpdaterTest::testSimpleThreadedProgress() { TestProgressBar bar; KoProgressUpdater pu(&bar); pu.start(); QPointer<KoUpdater> u = pu.startSubtask(); TestJob t(u); t.start(); while (!t.isFinished()) { QTest::qSleep(WAIT_FOR_PROGRESSUPDATER_UI_UPDATES); // allow the action to do its job. QCoreApplication::processEvents(); // allow the actions 'gui' stuff to run. } QCOMPARE(bar.value, 100); }
void KoProgressUpdaterTest::testCreation() { TestProgressBar bar; KoProgressUpdater pu(&bar); QPointer<KoUpdater> updater = pu.startSubtask(); QCOMPARE(bar.min, 0); QCOMPARE(bar.max, 0); QCOMPARE(bar.value, 0); QVERIFY(bar.formatString.isNull()); pu.start(); QCOMPARE(bar.min, 0); QCOMPARE(bar.max, 99); QCOMPARE(bar.value, 0); }
//Evaluate right continuous surface data. //Evaluate all positional data, 1st and 2nd derivatives. void MGSBRep::eval_all( double u, double v, // Parameter value of the surface. MGPosition& f, // Positional data. MGVector& fu, // df(u,v)/du MGVector& fv, // df/dv MGVector& fuv, // d**2f/(du*dv) MGVector& fuu, // d**2f/(du**2) MGVector& fvv // d**2f/(dv**2) ) const { size_t ku=order_u(), kv=order_v(); size_t ku2=ku+ku, kv2=kv+kv; double *ucoef=new double[ku*3], *vcoef=new double[kv*3]; int bdum1=bdim_u()-1, bdvm1=bdim_v()-1; int uid=m_uknot.eval_coef(u,ucoef,0); int vid=m_vknot.eval_coef(v,vcoef,0); m_uknot.eval_coef(u,ucoef+ku,1); m_uknot.eval_coef(u,ucoef+ku2,2); m_vknot.eval_coef(v,vcoef+kv,1); m_vknot.eval_coef(v,vcoef+kv2,2); double s,su,suu,c,vj,vj1; size_t i,j,k,dim=sdim(); int ii,jj; MGPosition p(dim); MGVector pu(dim),pv(dim),puv(dim),puu(dim),pvv(dim); for(k=0; k<dim; k++){ p(k)=0.0;pu.set(k)=0.0;pv.set(k)=0.0;puv.set(k)=0.0; puu.set(k)=0.0;pvv.set(k)=0.0; for(j=0; j<kv; j++){ s=su=suu=0.0; jj=vid+j; for(i=0; i<ku; i++){ ii=uid+i; c=coef(ii,jj,k); s=s+ucoef[i]*c; su=su+ucoef[i+ku]*c; suu=suu+ucoef[i+ku2]*c; } vj=vcoef[j]; vj1=vcoef[j+kv]; p(k)=p(k)+vj*s; pu.set(k)=pu.ref(k)+vj*su; pv.set(k)=pv.ref(k)+vj1*s; puv.set(k)=puv.ref(k)+vj1*su; puu.set(k)=puu.ref(k)+vj*suu; pvv.set(k)=pvv.ref(k)+vcoef[j+kv2]*s; } } f=p;fu=pu;fv=pv;fuv=puv;fuu=puu;fvv=pvv; delete[] ucoef; delete[] vcoef; }
void KisTransformWorkerTest::testYShear() { TestUtil::TestProgressBar bar; KoProgressUpdater pu(&bar); KoUpdaterPtr updater = pu.startSubtask(); const KoColorSpace * cs = KoColorSpaceRegistry::instance()->rgb8(); QImage image(QString(FILES_DATA_DIR) + QDir::separator() + "mirror_source.png"); KisPaintDeviceSP dev = new KisPaintDevice(cs); dev->convertFromQImage(image, ""); KisFilterStrategy * filter = new KisBoxFilterStrategy(); KisTransaction t("test", dev); KisTransformWorker tw(dev, 1.0, 1.0, 0.0, 1.0, 300., 200., 0.0, 0, 0, updater, filter, true); tw.run(); t.end(); QRect rc = dev->exactBounds(); QVERIFY(rc.width() == image.width()); QVERIFY(rc.height() == 959); // KisTransaction t2("test", dev); // KisRandomAccessorSP ac = dev->createRandomAccessorNG(rc.x(), rc.y()); // for(int x = rc.x(); x < rc.width(); ++x) { // for(int y = rc.y(); y < rc.height(); ++y) { // ac->moveTo(x, y); // cs->setOpacity(ac->rawData(), 0.5, 1); // } // } // t2.end(); QImage result = dev->convertToQImage(0, rc.x(), rc.y(), rc.width(), rc.height()); QPoint errpoint; image.load(QString(FILES_DATA_DIR) + QDir::separator() + "sheary_result.png"); if (!TestUtil::compareQImages(errpoint, image, result)) { image.save("sheary_source.png"); result.save("sheary_result.png"); QFAIL(QString("Failed to shear the image, first different pixel: %1,%2 \n").arg(errpoint.x()).arg(errpoint.y()).toAscii()); } }
void KoProgressUpdaterTest::testRecursiveProgress() { TestProgressBar bar; KoProgressUpdater pu(&bar); pu.start(); QPointer<KoUpdater> u1 = pu.startSubtask(); KoProgressUpdater pu2(u1); pu2.start(); QPointer<KoUpdater> u2 = pu2.startSubtask(); u2->setProgress(50); u2->setProgress(100); while(bar.value < 100) { QCoreApplication::processEvents(); QTest::qSleep(WAIT_FOR_PROGRESSUPDATER_UI_UPDATES); } QCOMPARE(bar.value, 100); }
void KoProgressUpdaterTest::testFromWeaver() { jobsdone = 0; TestProgressBar bar; KoProgressUpdater pu(&bar); pu.start(10); ThreadWeaver::Queue::instance()->setMaximumNumberOfThreads(4); for (int i = 0; i < 10; ++i) { QPointer<KoUpdater> up = pu.startSubtask(); ThreadWeaver::QObjectDecorator * job = new ThreadWeaver::QObjectDecorator(new TestWeaverJob(up, 10)); connect( job, SIGNAL(done(ThreadWeaver::JobPointer)), SLOT(jobDone(ThreadWeaver::JobPointer)) ); ThreadWeaver::Queue::instance()->enqueue(ThreadWeaver::make_job_raw(job)); } while (!ThreadWeaver::Queue::instance()->isIdle()) { QTest::qSleep(WAIT_FOR_PROGRESSUPDATER_UI_UPDATES); QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } ThreadWeaver::Queue::instance()->finish(); QCOMPARE(jobsdone, 10); }
/** Retrieve HTTP data from this URL. */ std::string osl::download_url(std::string URL,network_progress &p) { osl::url_parser pu(URL); http_connection c(pu.host,p,pu.port); c.send_get(pu.path); return c.receive(); }