示例#1
0
void MainWindow::onCreatePoint() {
    QVector<GLfloat> vertCoordsPoint = QVector<GLfloat>(0);

    this->getCoordsFromUser(vertCoordsPoint);
    if (vertCoordsPoint.size()) {
        Geometry::Point* p = new Geometry::Point(vertCoordsPoint.data()[0], vertCoordsPoint.data()[1], vertCoordsPoint.data()[2]);
        qDebug()<<"hierarchy: "<<p->getHierarchy();
        qDebug()<<"name: "<<p->getName();
    }
}
示例#2
0
	/**
	 * 画像のブロック転送
	 * @param dest 転送先のデバイスコンテキストオブジェクト
	 * @param sourcePosition 転送元の矩形範囲
	 * @param destPosition 転送先の矩形範囲
	 */
	bool blockTransfer(const DeviceContext& dest,
					   const geometry::Rectangle<int>& sourcePosition,
					   const geometry::Point<int>& destPosition) const throw()
	{
		return ::BitBlt(this->deviceContext,
						destPosition.getX(),
						destPosition.getY(),
						sourcePosition.getWidth(),
						sourcePosition.getHeight(),
						dest.getDeviceContext(),
						sourcePosition.getLeft(),
						sourcePosition.getTop(),
						SRCCOPY) == TRUE;
	}
            void Single::_storeBorder(const GEOMETRY::Point<uint32>& pos, PointVec<uint32>& borderTiles, sl::Bitset2D& bitset)
            {
                for (uint32 i = 0; i < 8; ++i)
                {
                    try
                    {
                        auto mapTileInfo = m_Layer.getBorderTileInfo(pos, static_cast<BorderTile>(i));
                        // resize bitset if needed
                        bitset.resize(std::max(bitset.getWidth(), pos.getX() + mapTileInfo.getPosition().getX() + 1),
                            std::max(bitset.getHeight(), pos.getY() + mapTileInfo.getPosition().getY() + 1));
                        if (bitset.get(mapTileInfo.getPosition()))
                            continue;
                        bitset.set(mapTileInfo.getPosition());

                        if (mapTileInfo.isValid() && mapTileInfo.isAutoTile())
                            borderTiles.push_back(mapTileInfo.getPosition());
                    }
                    catch (const EXCEPTION::TileOutOfRangeException&) {}
                }
            }
示例#4
0
 QPixmap createPixmap(const TileSet* pTileSet, CACHE::Tiles& tileCache)
 {
     QPixmap pixmap;
     if (pTileSet)
     {
         pixmap = QPixmap(pTileSet->getSize().getWidth() * MAP::TILE_SIZE, pTileSet->getSize().getHeight() * MAP::TILE_SIZE);
         pixmap.fill();
         QPainter painter(&pixmap);
         GEOMETRY::Point<uint32> pos;
         for (pos.getX() = 0; pos.getX() < pTileSet->getSize().getWidth(); ++pos.getX())
         {
             for (pos.getY() = 0; pos.getY() < pTileSet->getSize().getHeight(); ++pos.getY())
             {
                 auto info = tileCache.get(pTileSet->getTileID(pos));
                 if (info.isValid())
                     painter.drawPixmap(pos.getX()*MAP::TILE_SIZE, pos.getY()*MAP::TILE_SIZE, *info.getPixmap(), info.getPosition().getX(), info.getPosition().getY(),
                     MAP::TILE_SIZE, MAP::TILE_SIZE);
             }
         }
     }
     return pixmap;
 }
            void Single::_do(const MapTileInfo& info, MapTileInfoVec& tiles, PointVec<uint32>& borderTiles)
            {
                // first set complete brush size -> bitset is checked
                sl::Bitset2D bitset;
                for (GEOMETRY::Point<uint32> pos; pos.getX() < getBrushSize().getWidth(); ++pos.getX())
                {
                    for (pos.getY() = 0; pos.getY() < getBrushSize().getHeight(); ++pos.getY())
                    {
                        try
                        {
                            auto mapTileInfo = m_Layer.getMapTile(pos + getStartPosition());
                            tiles.push_back(mapTileInfo);
                            if (pos.getX() == 0 || pos.getX() + 1 == getBrushSize().getWidth())
                            {
                                if (pos.getY() == 0 || pos.getY() + 1 == getBrushSize().getHeight())
                                    borderTiles.push_back(mapTileInfo.getPosition());
                            }

                            // resize bitset if needed
                            bitset.resize(std::max(bitset.getWidth(), pos.getX() + mapTileInfo.getPosition().getX() + 1),
                                std::max(bitset.getHeight(), pos.getY() + mapTileInfo.getPosition().getY() + 1));

                            bitset.set(pos + mapTileInfo.getPosition());
                        }
                        catch (const EXCEPTION::TileOutOfRangeException&) {}
                    }
                }

                // after that, we can really check borders
                for (GEOMETRY::Point<uint32> pos; pos.getX() < getBrushSize().getWidth(); ++pos.getX())
                {
                    for (pos.getY() = 0; pos.getY() < getBrushSize().getHeight(); ++pos.getY())
                        _storeBorder(getStartPosition() + pos, borderTiles, bitset);
                }
                
            }
void NodeColorSampler::operator()(LidarProcessOctree::Node& node,unsigned int nodeLevel)
	{
	if(node.isLeaf())
		{
		if(node.getNumPoints()>0)
			{
			/* Find all images whose bounding boxes overlap this node: */
			std::vector<Image2D*> nodeImages;
			for(std::vector<Image2D*>::const_iterator iIt=images.begin();iIt!=images.end();++iIt)
				{
				const Image2D::Box& box=(*iIt)->getWorldBox();
				if(box.min[0]-lpo.getOffset()[0]<node.getDomain().getMax()[0]&&box.max[0]-lpo.getOffset()[0]>node.getDomain().getMin()[0]
		  		 &&box.min[1]-lpo.getOffset()[1]<node.getDomain().getMax()[1]&&box.max[1]-lpo.getOffset()[1]>node.getDomain().getMin()[1])
					nodeImages.push_back(*iIt);
				}
			
			/* Page in all found images: */
			imageCacher.requestImages(nodeImages);
			
			/* Assign a color to each LiDAR point in this node: */
			for(unsigned int i=0;i<node.getNumPoints();++i)
				{
				/* Copy the point's original color: */
				colorBuffer[i]=node[i].value;
				
				/* Lookup the point in all images overlapping this node: */
				Geometry::Point<double,3> pos;
				for(int j=0;j<3;++j)
					pos[j]=double(node[i][j]+lpo.getOffset()[j]);
				for(std::vector<Image2D*>::iterator iIt=nodeImages.begin();iIt!=nodeImages.end();++iIt)
					{
					Image2D::SampleResult sr=(*iIt)->getColor(Image2D::Point(pos.getComponents()));
					if(sr.first)
						{
						/* Copy the sample result: */
						for(int j=0;j<3;++j)
							colorBuffer[i][j]=sr.second[j];
						colorBuffer[i][3]=Color::Scalar(255);
						
						++numAssignedColors;
						
						/* Bail out: */
						break;
						}
					}
				}
			}
		}
	else
		{
		/* Get pointers to the node's children and load their color arrays: */
		colorFile.flush();
		for(int childIndex=0;childIndex<8;++childIndex)
			{
			LidarProcessOctree::Node* child=lpo.getChild(&node,childIndex);
			if(child->getNumPoints()>0)
				{
				colorFile.setReadPosAbs(LidarDataFileHeader::getFileSize()+colorDataSize*child->getDataOffset());
				colorFile.read(childColorBuffers[childIndex],child->getNumPoints());
				}
			}
		
		/* Find the direct ancestors of all LiDAR points in this node and copy their color values from the child arrays: */
		for(unsigned int i=0;i<node.getNumPoints();++i)
			{
			/* Find the child node containing this point's ancestor: */
			int pointChildIndex=node.getDomain().findChild(node[i]);
			LidarProcessOctree::Node* pointChild=lpo.getChild(&node,pointChildIndex);
			
			/* Find the point's ancestor: */
			NodePointFinder npf(node[i]);
			lpo.processNodePointsDirected(pointChild,npf);
			if(npf.getFoundPoint()==0)
				{
				/* This is an internal corruption in the octree file. Print a helpful and non-offensive error message: */
				Misc::throwStdErr("Fatal error: Octree file corrupted around position (%f, %f, %f)",node[i][0],node[i][1],node[i][2]);
				}
			
			/* Retrieve the ancestor's color: */
			colorBuffer[i]=childColorBuffers[pointChildIndex][npf.getFoundPoint()-pointChild->getPoints()];
			}
		}
	
	/* Write the node's colors to the color file: */
	colorFile.setWritePosAbs(LidarDataFileHeader::getFileSize()+colorDataSize*node.getDataOffset());
	colorFile.write(colorBuffer,node.getNumPoints());
	
	/* Update the progress counter: */
	++numProcessedNodes;
	if(numProcessedNodes>=nextProgressUpdate)
		{
		int percent=int((numProcessedNodes*100+lpo.getNumNodes()/2)/lpo.getNumNodes());
		std::cout<<"\rAssigning colors... "<<std::setw(3)<<percent<<"%"<<std::flush;
		nextProgressUpdate=((percent+1)*lpo.getNumNodes()-lpo.getNumNodes()/2+99)/100;
		}
	}