Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/circuits/QCCnot.cpp

Parent Directory Parent Directory | Revision Log Revision Log


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

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26