File: app_xfigconstruction.cpp

package info (click to toggle)
gfan 0.3dfsg-1
  • links: PTS
  • area: main
  • in suites: lenny, squeeze
  • size: 2,012 kB
  • ctags: 1,935
  • sloc: cpp: 17,728; makefile: 251
file content (107 lines) | stat: -rw-r--r-- 2,728 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "vektor.h"
#include "printer.h"
#include "parser.h"
#include "gfanapplication.h"

class XfigConstructionApplication : public GFanApplication
{
public:
  bool includeInDefaultInstallation()
  {
    return false;
  }
  XfigConstructionApplication()
  {
    registerOptions();
  }
  char *name()
  {
    return "_xfigconstruction";
  }
  int main()
  {
    int dimension=4;
    FileParser P(Stdin);
    IntegerVectorList a=P.parseIntegerVectorList();
    IntegerVectorList b=P.parseIntegerVectorList();
    IntegerVector invertVector=P.parseIntegerVector();

    int nEdges=a.begin()->size();
    int nCycles=a.size()/dimension;
    fprintf(Stderr,"nEdges %i nCycles %i\n",nEdges,nCycles);

    for(int i=0;i<nEdges;i++)
      {
	IntegerVector direction(dimension);

	IntegerVectorList::const_iterator J=a.begin();
	for(int j=0;j<nCycles;j++)
	  {
	    for(int k=0;k<dimension;k++)
	      {
		direction[k]=(*J)[i];
		J++;
	      }
	    if(dot(direction,direction))break;
	  }
	direction=invertVector[i]*direction;
	IntegerVector scaleVectorSum(dimension);
	if(dot(direction,direction))
	  {
	    IntegerVectorList::const_iterator J=a.begin();
	    for(int j=0;j<nCycles;j++)
	      {
		IntegerVector cycleVector(dimension);
		for(int k=0;k<dimension;k++)
		  {
		    cycleVector[k]=(*J)[i];
		    J++;
		  }
		int sign=dot(cycleVector,direction)/dot(direction,direction);
		
		IntegerVector scaleVector(dimension);
		for(int k=0;k<dimension;k++)
		  {
		    scaleVector[k]=(*b.begin())[j*4+k];
		  }
		scaleVectorSum+=sign*scaleVector;
	      }
	    if(!scaleVectorSum.isZero())
	      {
		fprintf(Stderr,"%i:",i);
		AsciiPrinter(Stderr).printVector(direction);
		AsciiPrinter(Stderr).printVector(scaleVectorSum);
		
		fprintf(Stderr," %i\n",dot(direction,scaleVectorSum));
		fprintf(Stdout,"4 0 0 50 -1 0 6 0.0000 6 480 2805 3375 3675 ");
		fprintf(Stdout,"$\\\\left(\\\\begin{tabular}{c}");
		for(int k=0;k<dimension;k++)
		  {
		    if(k)fprintf(Stdout,"\\\\\\\\");
		    fprintf(Stdout," %i ",scaleVectorSum[k]);
		  }
		fprintf(Stdout,"\\\\end{tabular}\\\\right)");
		fprintf(Stdout,"\\\\cdot s_{%i}",i);
		fprintf(Stdout,"\\\\left(\\\\begin{tabular}{c}");
		for(int k=0;k<dimension;k++)
		  {
		    if(k)fprintf(Stdout,"\\\\\\\\");
		    fprintf(Stdout," %i ",direction[k]);
		  }
		fprintf(Stdout,"\\\\end{tabular}\\\\right)$");
		fprintf(Stdout,"\\001\n");
		
	      }	    
	  }
      }

    AsciiPrinter(Stdout).printVectorList(multiplyIntegerVectorList(a,b));
    return 0;
  }
  const char *helpText()
  {
    return "This program should not be in the final release. It is used for generating xfig files for showing non realizable state polyhedra.\n";
  }
};

static XfigConstructionApplication theApplication;