bool Marker::equals( const Marker& other ) const { /* * \note these first two are commented as the basic shape ability has been * removed from marker at this point. */ // This gets too complicated to check. //if ( !usesDefault ) return false; // This one default, other not. //if ( !other.hasDefaultMark() ) return false; return ((this->shapeEquals(other)) && (markerColor == other.getColor())); // Check if the marks are different. //if ( mark != other.getMark() ) return false; // Check if the mark colors are different. //if ( markerColor != other.getColor() ) return false; // Check if the ranges are different //if ( range != other.getRange() ) return false; // Bothe use the same default mark and color. //return true; }
void SeriesList::drawInFrame(Frame& innerFrame, double minX, double maxX, double minY, double maxY) { double multX = innerFrame.getWidth()/(maxX-minX); double multY = innerFrame.getHeight()/(maxY-minY); // Draw lines for(int i=0;i<getNumSeries();i++) { innerFrame.push_state(); StrokeStyle s = getStyle(i); Marker m = getMarker(i); if(m.getColor().isClear() && s.getColor().isClear()) { innerFrame << Comment("Plot contained data with clear stroke and marker. Skipping."); continue; } vector< pair<double,double> >& vec = getPointList(i); Path curve(vec,innerFrame.lx(), innerFrame.ly()); // What I'd give for a line of haskell... // map (\(x,y) -> (multX*(x-minX), multY*(y-minY))) vector map_object map_instance(multX,minX,multY,minY); innerFrame.setMarker(m); innerFrame.setLineStyle(s); if(s.getColor().isClear()) { // crop auto_ptr< Path > cropX = Splitter::cropToBox(minX,maxX,minY,maxY,curve); // Fit it to the box. std::for_each(cropX->begin(), cropX->end(), map_instance); // Draw the line innerFrame.line(*cropX); } else { // interpolate auto_ptr< std::list<Path> > interpX = Splitter::interpToBox(minX,maxX,minY,maxY,curve); for(std::list<Path>::iterator i=interpX->begin();i!=interpX->end();i++) { // Fit it to the box std::for_each(i->begin(), i->end(), map_instance); // Draw the line innerFrame.line(*i); } } innerFrame.pop_state(); } }
void SVGImage::defineMarker (const Marker& marker, int dfltname) { if( lastMarker == marker ) return; using namespace std; string name = marker.uniqueName(); //cout << name << endl;; string savedtab=tab; string marktab=string(" "); string intab=string(" "); ostr << tab << "<defs>\n"; double r = marker.getRange(); double r2 = 2*r; ostr << marktab << "<marker id=\"" << name << "\" markerUnits=\"strokeWidth\" " << "markerWidth=\"" << r2 << "\" markerHeight=\"" << r2 << "\" " << "viewBox=\"0 0 " << r2 << " " << r2 << "\" \n" << marktab << " " << "refX=\"" << r << "\" refY=\"" << r << "\" "; string col; { stringstream ss; ss.fill('0'); ss << '#' << hex << setw(6) << marker.getColor().getRGB(); col = ss.str(); } // These are here just in case. ostr.fill('0'); ostr << "stroke-width=\".2pt\" " << "fill=\"none\">\n"; // Initial marker tab is set up...now to put the shape in... if (marker.hasDefaultMark()) { Marker::Mark mark = marker.getMark(); switch(mark) { case Marker::DOT: ostr << intab << "<circle cx=\"" << r << "\" cy=\"" << r << "\" " <<"r=\"" << r << "\" style=\"fill:" << col << ";stroke:" << col << "\"/>\n"; break; case Marker::PLUS: ostr << intab << "<line x1=\"0\" y1=\"" << r << "\" " << "x2=\"" << r2 << "\" y2=\"" << r << "\"/>\n"; ostr << intab << "<line x1=\"" << r << "\" y1=\"0\" " << "x2=\"" << r << "\" y2=\"" << r2 << "\"/>\n"; break; case Marker::X: ostr << intab << "<line x1=\"0\" y1=\"0\" " << "x2=\"" << r2 << "\" y2=\"" << r2 << "\"/>\n"; ostr << intab << "<line x1=\"" << r2 << "\" y1=\"0\" " << "x2=\"0\" y2=\"" << r2 << "\"/>\n"; break; } } else { //This should not be called as BasicShapes were removed...but left // here as a placeholder if it ever comes back. //Todo: // * Make sure marker color works as necessary (useMarkerColor) // * Add some to the tab variable? // * Need to fix shape coordinates? //ostr << intab << markerShape << endl; } ostr << marktab << "</marker>\n"; ostr << tab << "</defs>\n"; markerDefined = true; lastMarker = marker; }