OSDN Git Service

Initial Commit
[qcad/qcad.git] / circuits / QCCnot.cpp
1 //---------------------------------------------------------------------------\r
2 // Toffoli Gate\r
3 //---------------------------------------------------------------------------\r
4 #include <stdlib.h>\r
5 #include "QCCnot.h"\r
6 #include "StrUtils.h"\r
7 //---------------------------------------------------------------------------\r
8 QCCNot::QCCNot(int x,int y) :QCircuit(x,y) {\r
9   Name = GetTypeStr();\r
10   Target1 = Y;\r
11   Target2 = Y;\r
12 }\r
13 //---------------------------------------------------------------------------\r
14 QCCNot::QCCNot(int x,int y, string param) :QCircuit(x,y) {\r
15   Name = GetTypeStr();\r
16   Target1 = Y;\r
17   Target2 = Y;\r
18   vector<string> v = StrUtils::split_str(param);\r
19   Target1 = atoi(v[0].c_str());\r
20   Target2 = atoi(v[1].c_str());\r
21 }\r
22 //---------------------------------------------------------------------------\r
23 void\r
24 QCCNot::Draw(QDraw *qDraw) {\r
25 \r
26   int GridSize = qDraw->GetGridSize();\r
27   int UnitSize = qDraw->GetUnitSize();\r
28 \r
29   int tx = X;\r
30   int ty = Target1;\r
31 \r
32   int tx1 = tx*GridSize + GridSize/2;\r
33   int ty1 = ty*GridSize + GridSize/2;\r
34   int tx2 = X*GridSize + GridSize/2;\r
35   int ty2 = Y*GridSize + GridSize/2;\r
36   qDraw->SetPenColor(clBlack);\r
37   qDraw->DrawLine(tx1,ty1,tx2,ty2);\r
38   qDraw->SetBrushColor(clBlack);\r
39   qDraw->Ellipse(tx1-4,ty1-4,tx1+5,ty1+5);\r
40 \r
41   tx = X;\r
42   ty = Target2;\r
43 \r
44   tx1 = tx*GridSize + GridSize/2;\r
45   ty1 = ty*GridSize + GridSize/2;\r
46   tx2 = X*GridSize + GridSize/2;\r
47   ty2 = Y*GridSize + GridSize/2;\r
48   qDraw->SetPenColor(clBlack);\r
49   qDraw->DrawLine(tx1,ty1,tx2,ty2);\r
50   qDraw->SetBrushColor(clBlack);\r
51   qDraw->Ellipse(tx1-4,ty1-4,tx1+5,ty1+5);\r
52 \r
53   int d = (GridSize-UnitSize)/2;\r
54   int x1 = X * GridSize+d;\r
55   int y1 = Y * GridSize+d;\r
56   int x2 = x1 + UnitSize;\r
57   int y2 = y1 + UnitSize;\r
58 \r
59   qDraw->SetBrushColor(clWhite);\r
60   qDraw->FillRect(x1,y1,x2,y2);\r
61   qDraw->SetPenColor(clBlack);\r
62   qDraw->SetBrushColor(clWhite);\r
63   qDraw->Ellipse(x1,y1,x2,y2);\r
64   qDraw->DrawLine(x1+UnitSize/2,y1,x1+UnitSize/2,y2);\r
65   qDraw->DrawLine(x1,y1+UnitSize/2,x2,y1+UnitSize/2);\r
66 }\r
67 //---------------------------------------------------------------------------\r
68 string\r
69 QCCNot::GetCalcText(void) {\r
70   ostringstream os;\r
71   os << "CCNOT(";\r
72   os << "q[" << Y       << "],";\r
73   os << "q[" << Target1 << "],";\r
74   os << "q[" << Target2 << "])";\r
75   return os.str();\r
76 }\r
77 //---------------------------------------------------------------------------\r
78 void\r
79 QCCNot::DrawPS(QPSDraw *psDraw) {\r
80 \r
81   int GridSize = psDraw->GetGridSize();\r
82   int UnitSize = psDraw->GetUnitSize();\r
83 \r
84   int tx = X;\r
85   int ty = Target1;\r
86 \r
87   int tx1 = tx*GridSize + GridSize/2;\r
88   int ty1 = ty*GridSize + GridSize/2;\r
89   int tx2 = X*GridSize + GridSize/2;\r
90   int ty2 = Y*GridSize + GridSize/2;\r
91   psDraw->DrawLine(tx1,ty1,tx2,ty2);\r
92   psDraw->DrawFillCircle(tx1,ty1,4);\r
93 \r
94   tx = X;\r
95   ty = Target2;\r
96 \r
97   tx1 = tx*GridSize + GridSize/2;\r
98   ty1 = ty*GridSize + GridSize/2;\r
99   tx2 = X*GridSize + GridSize/2;\r
100   ty2 = Y*GridSize + GridSize/2;\r
101   psDraw->DrawLine(tx1,ty1,tx2,ty2);\r
102   psDraw->DrawFillCircle(tx1,ty1,4);\r
103 \r
104   int d = (GridSize-UnitSize)/2;\r
105   int x1 = X * GridSize+d;\r
106   int y1 = Y * GridSize+d;\r
107   int x2 = x1 + UnitSize;\r
108   int y2 = y1 + UnitSize;\r
109 \r
110   psDraw->FillRect(x1,y1,x2,y2);\r
111   psDraw->DrawCircle(X*GridSize + GridSize/2,Y*GridSize + GridSize/2,UnitSize/2);\r
112   psDraw->DrawLine(x1+UnitSize/2,y1,x1+UnitSize/2,y2);\r
113   psDraw->DrawLine(x1,y1+UnitSize/2,x2,y1+UnitSize/2);\r
114 }\r
115 //---------------------------------------------------------------------------\r
116 string\r
117 QCCNot::GetParam(void) {\r
118   ostringstream os;\r
119   os << Target1 << "," << Target2;\r
120   return os.str();\r
121 }\r
122 //---------------------------------------------------------------------------\r
123 void\r
124 QCCNot::Reverse(int y) {\r
125   Y = y - Y;\r
126   Target1 = y - Target1;\r
127   Target2 = y - Target2;\r
128 }\r
129 //---------------------------------------------------------------------------\r
130 TRect QCCNot::GetOccupiedRect() {\r
131   TRect rc;\r
132   rc.left = this->X;\r
133   rc.right = this->X + 1;\r
134   rc.top = this->Y;\r
135   rc.bottom = this->Y + 1;\r
136   if (this->Target1 < this->Y) {\r
137     rc.top = this->Target1;\r
138   } else {\r
139     rc.bottom = this->Target1 + 1;\r
140   }\r
141 \r
142   if (this->Target2 < rc.top) {\r
143     rc.top = this->Target2;\r
144   } else if (this->Target2 >= rc.bottom) {\r
145     rc.bottom = this->Target2 + 1;\r
146   }\r
147   return rc;\r
148 }\r
149 //--------------------------------------------------------------------------\r
150 QCircuit *QCCNot::Clone() {\r
151   QCCNot * qc = new QCCNot(X, Y);\r
152   qc->SetTarget1(GetTarget1());\r
153   qc->SetTarget2(GetTarget2());\r
154   return (QCircuit*)qc;\r
155 }\r
156 //---------------------------------------------------------------------------\r