summaryrefslogtreecommitdiff
path: root/drawing/src
diff options
context:
space:
mode:
Diffstat (limited to 'drawing/src')
-rw-r--r--drawing/src/lineSegmenter.cpp66
-rw-r--r--drawing/src/lineSegmenter.h6
-rw-r--r--drawing/src/main.cpp2
-rw-r--r--drawing/src/ofApp.cpp63
-rw-r--r--drawing/src/ofApp.h10
5 files changed, 128 insertions, 19 deletions
diff --git a/drawing/src/lineSegmenter.cpp b/drawing/src/lineSegmenter.cpp
index f848272..47a9d62 100644
--- a/drawing/src/lineSegmenter.cpp
+++ b/drawing/src/lineSegmenter.cpp
@@ -1,15 +1,67 @@
#include "lineSegmenter.h"
-const vector <ofPolyline> & lineSegmenter::getSegments(int num,float coverage, float phase) const{
- segments.clear();
+const vector <ofPolyline> & lineSegmenter::getSegments(int num,float coverage, float phase){
+ //num - number of segments
+ //coverage - amount that each segment fills it's slot from 0-1
+ //phase - from 0-1
+
+ //if the path is closed, we can make a segment that crosses the end/beginning
+ //however we want to be able to deal with open paths
+
+/*
+
+segments 0...n - 1
+phase 0...1
+
+phase 0
+
+segment 0 is (0 -> coverage) / n
+segment n - 1 is ((0 -> coverage) + (n-1)) /n
+
+phase 1: has to be the loop target, it has to look identical
+
+segment 0 is (1 -> coverage) / n
+segment n - 1 is (1 - > coverage) + (n-1)
+
+*/
- float spacing=1.0f/num;
+
+ segments.clear();
for (int i=0;i<num;i++){
- float endIndex=line.getIndexAtPercent(phase+(i*spacing));
+ float startIndex=line.getIndexAtPercent((phase+i)/num); //always <1
+ float endPoint=(phase+i+coverage)/num; //can be >1
+ float endIndex=line.getIndexAtPercent(endPoint>1.0f?endPoint-1.0f:endPoint);
+ ofPolyline segment;
+ segment.addVertex(line.getPointAtIndexInterpolated(startIndex));
+ for (int j=(int)ceil(startIndex);j<(endPoint>1?line.size():(int)ceil(endIndex));j++){
+ segment.addVertex(line[j]);
+ }
+ if (endPoint>1){
+ segments.push_back(segment);
+ segment.clear();
+ for (int j=0;j<(int)ceil(endIndex);j++){
+ segment.addVertex(line[j]);
+ }
+ segment.addVertex(line.getPointAtIndexInterpolated(endIndex));
+ }
+ else {
+ segment.addVertex(line.getPointAtIndexInterpolated(endIndex));
+ }
+ segments.push_back(segment);
}
- float endlength=line.getIndex
-
return segments;
-} \ No newline at end of file
+}
+
+void lineSegmenter::draw(){
+ line.draw();
+ return;
+}
+
+/*
+
+
+
+
+*/ \ No newline at end of file
diff --git a/drawing/src/lineSegmenter.h b/drawing/src/lineSegmenter.h
index 15797a1..25f3d55 100644
--- a/drawing/src/lineSegmenter.h
+++ b/drawing/src/lineSegmenter.h
@@ -6,8 +6,12 @@ class lineSegmenter{
public:
lineSegmenter(ofPolyline &_line){
line=_line;
+ if (line.isClosed()){
+ line.addVertex(line[0]);
+ }
}
- const vector <ofPolyline> &getSegments(int num,float coverage, float phase) const;
+ const vector <ofPolyline> &getSegments(int num,float coverage, float phase);
+ void draw();
private:
ofPolyline line;
vector <ofPolyline> segments;
diff --git a/drawing/src/main.cpp b/drawing/src/main.cpp
index 0d7049c..f9ba23c 100644
--- a/drawing/src/main.cpp
+++ b/drawing/src/main.cpp
@@ -9,7 +9,7 @@ int main(int argc, char *argv[]){
ofGLFWWindowSettings settings;
- settings.width = 800;
+ settings.width = 600;
settings.height = 800;
shared_ptr<ofAppBaseWindow> mainWindow = ofCreateWindow(settings);
diff --git a/drawing/src/ofApp.cpp b/drawing/src/ofApp.cpp
index f4a00b5..43069d2 100644
--- a/drawing/src/ofApp.cpp
+++ b/drawing/src/ofApp.cpp
@@ -5,7 +5,7 @@
//--------------------------------------------------------------
void ofApp::setup(){
ofxSVG svg;
- svg.load("shapes.svg");
+ svg.load("haring.svg");
vector <ofPath> paths= svg.getPaths();
for (int i=0;i<paths.size();i++){
@@ -15,12 +15,17 @@ void ofApp::setup(){
vector <ofPolyline> outlines= paths[i].getOutline();
for (int j=0;j<outlines.size();j++){
- segments.push_back(lineSegmenter(outlines[j]));
+ segmenters.push_back(lineSegmenter(outlines[j]));
}
}
- cout << "Found " << segments.size() << " segments";
+ cout << "Found " << paths.size() << " paths with " << segmenters.size() << " shapes" <<std::endl;
+
+ numsegments=1;
+ coverage=0.5;
+
+ mode=0;
ofSetFrameRate(30);
}
@@ -39,20 +44,38 @@ void ofApp::draw(){
ofBackground(0,0,0);
ofSetColor(255,255,255);
- glTranslatef(128,128,0);
+ glTranslatef(-80,-130,0);
-
+ int segmentsdrawn=0;
-
+ switch (mode){
+ case 0:{
+ float phase=fmod(ofGetElapsedTimef(),1);
-
+
+
+ for (auto shape=segmenters.begin();shape!=segmenters.end();shape++){
+ auto segments=shape->getSegments(numsegments,coverage,phase);
+ for (auto segment=segments.begin();segment!=segments.end();segment++){
+ segment->draw();
+ segmentsdrawn++;
+ }
+ }
+ }
+ case 1:{
+ int w=ofRandom(1000);
+ segmenters[w%segmenters.size()].draw();
+ }
+ }
- //svg.draw();
+
std::stringstream strm;
- strm << "segments: "<<segments.size();
+ strm << "segments: "<<segmentsdrawn;
ofSetWindowTitle(strm.str());
+ mainOutputSyphonServer.publishScreen();
+
}
@@ -74,6 +97,28 @@ void ofApp::keyPressed(ofKeyEventArgs &args){
//--------------------------------------------------------------
void ofApp::keyReleased(int key){
+ switch(key){
+ case '[':{
+ numsegments=max(0,numsegments-1);
+ break;
+ }
+ case ']':{
+ numsegments++;
+ break;
+ }
+ case '{':{
+ coverage=coverage*0.9f;
+ break;
+ }
+ case '}':{
+ coverage=min(coverage/0.9f,1.0f);
+ break;
+ }
+ case 'p':{
+ mode=(mode==1?0:1);
+ break;
+ }
+ }
}
diff --git a/drawing/src/ofApp.h b/drawing/src/ofApp.h
index 05d4441..32b848c 100644
--- a/drawing/src/ofApp.h
+++ b/drawing/src/ofApp.h
@@ -4,6 +4,8 @@
#include "ofxSvg.h"
#include "lineSegmenter.h"
+#include "ofxSyphon.h"
+
class ofApp : public ofBaseApp{
@@ -30,6 +32,12 @@ class ofApp : public ofBaseApp{
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
- vector <lineSegmenter> segments;
+ vector <lineSegmenter> segmenters;
+ int numsegments;
+ float coverage;
+
+ int mode;
+
+ ofxSyphonServer mainOutputSyphonServer;
};