00001
00002 '''
00003 hand_planes.py
00004 Mac Mason <mac@cs.duke.edu>
00005
00006 Machine-readable representation of my hand-segmented planes for verification.
00007 '''
00008
00009 names = {'2011-08-04-12-16-23' : 0,
00010 '2011-08-11-01-31-15' : 1,
00011 '2011-08-16-20-59-00' : 2,
00012 '2011-08-25-09-31-05' : 3}
00013
00014 names_rev = dict([(names[k], k) for k in names])
00015
00016
00017
00018 voxels = [{}, {}, {}, {}]
00019 voxels[0] = {
00020 'interndesk' : ['501x1165x1529',
00021 '502x1166x1529',
00022 '527x1145x1529',
00023 '518x1140x1529'],
00024 'partialcart' : ['499x1076x1527',
00025 '504x1078x1527',
00026 '514x1060x1527',
00027 '505x1055x1527'],
00028 'greenroom' : ['616x1374x1524',
00029 '668x1393x1524',
00030 '694x1327x1524',
00031 '643x1309x1524'],
00032 'armature' : ['145x1179x1525',
00033 '167x1185x1525',
00034 '185x1134x1525',
00035 '164x1127x1525'],
00036 'sailboat' : ['1376x305x1526',
00037 '1453x336x1526',
00038 '1457x318x1526',
00039 '1403x295x1526'],
00040 'pooltable' : ['569x823x1527',
00041 '605x745x1527',
00042 '651x762x1527',
00043 '615x841x1527'],
00044 'robotcounter' : ['796x1201x1526',
00045 '886x1240x1526',
00046 '896x1219x1526',
00047 '806x1182x1526'],
00048 'bookscounter' : ['549x1146x1527',
00049 '540x1164x1527',
00050 '542x1192x1527',
00051 '560x1148x1527'],
00052 'laptopcounter' : ['1425x1392x1526',
00053 '1441x1397x1526',
00054 '1472x1323x1526',
00055 '1453x1315x1526'],
00056 'firsttable' : ['955x1504x1526',
00057 '995x1521x1526',
00058 '1005x1494x1526',
00059 '965x1477x1526'],
00060 'secondtable' : ['931x1557x1525',
00061 '971x1574x1525',
00062 '983x1548x1525',
00063 '943x1534x1525'],
00064 'thirdtable' : ['899x1640x1525',
00065 '939x1656x1525',
00066 '949x1629x1525',
00067 '908x1613x1525'],
00068 'longtable' : ['990x1667x1525',
00069 '1021x1675x1525',
00070 '1086x1523x1525',
00071 '1054x1509x1525'],
00072 'printer' : ['204x1236x1529',
00073 '210x1240x1529',
00074 '224x1211x1529',
00075 '217x1207x1529'],
00076 'tvcounter' : ['485x1305x1527',
00077 '495x1306x1527',
00078 '510x1273x1527',
00079 '499x1269x1527'],
00080 'tvcounter2' : ['493x1265x1527',
00081 '510x1269x1527',
00082 '515x1257x1527',
00083 '498x1255x1527']
00084 }
00085
00086 voxels[1] = {
00087 'mobilecounter' : ['736x1343x1520',
00088 '751x1349x1520',
00089 '759x1329x1520',
00090 '743x1322x1520'],
00091 'tvcounter' : ['499x1298x1527',
00092 '508x1300x1527',
00093 '522x1267x1527',
00094 '510x1268x1527'],
00095 'cardboard' : ['1284x317x1528',
00096 '1320x331x1528',
00097 '1329x312x1528',
00098 '1292x296x1528'],
00099 'stool' : ['1251x1473x1530',
00100 '1269x1470x1530',
00101 '1265x1456x1530',
00102 '1251x1459x1530'],
00103 'greenroom' : ['641x1352x1524',
00104 '692x1370x1524',
00105 '728x1283x1524',
00106 '682x1264x1524'],
00107 'pooltable' : ['587x818x1527',
00108 '630x838x1527',
00109 '665x758x1527',
00110 '621x736x1527'],
00111 'sinkcounter' : ['684x905x1530',
00112 '714x916x1530',
00113 '771x794x1530',
00114 '745x780x1530'],
00115 'bookscounter' : ['543x1186x1526',
00116 '554x1194x1526',
00117 '575x1145x1526',
00118 '561x1140x1526'],
00119 'sailboat' : ['1382x298x1525',
00120 '1468x335x1525',
00121 '1477x317x1525',
00122 '1397x282x1525'],
00123 'firsttable' : ['969x1503x1525',
00124 '1007x1518x1525',
00125 '1016x1491x1525',
00126 '980x1476x1525'],
00127 'secondtable' : ['945x1557x1525',
00128 '985x1573x1525',
00129 '996x1549x1525',
00130 '955x1531x1525'],
00131 'thirdtable' : ['911x1640x1525',
00132 '952x1654x1525',
00133 '963x1629x1525',
00134 '922x1615x1525'],
00135 'fourthtable' : ['861x1758x1526',
00136 '900x1771x1526',
00137 '912x1743x1526',
00138 '872x1727x1526'],
00139 'longtable' : ['1047x1563x1525',
00140 '1071x1594x1525',
00141 '1098x1520x1525',
00142 '1066x1508x1525'],
00143 'robotcounter' : ['810x1197x1526',
00144 '897x1233x1526',
00145 '905x1212x1526',
00146 '822x1177x1526'],
00147 'laptopcounter' : ['1442x1387x1527',
00148 '1457x1394x1527',
00149 '1486x1318x1527',
00150 '1471x1312x1527'],
00151 'computercounter' : ['808x1281x1524',
00152 '889x1312x1524',
00153 '896x1297x1524',
00154 '812x1265x1524'],
00155 'printer1' : ['196x1284x1527',
00156 '213x1289x1527',
00157 '220x1238x1527',
00158 '215x1236x1527'],
00159 'printer2' : ['217x1234x1527',
00160 '234x1240x1527',
00161 '244x1217x1527',
00162 '231x1204x1527']
00163 }
00164
00165 voxels[2] = {
00166 'bookcounter' : ['546x1187x1527',
00167 '558x1194x1527',
00168 '579x1146x1527',
00169 '553x1163x1527'],
00170 'greenroom' : ['647x1353x1525',
00171 '686x1366x1525',
00172 '726x1284x1525',
00173 '686x1266x1525'],
00174 'pooltable' : ['591x822x1526',
00175 '633x840x1526',
00176 '672x758x1526',
00177 '631x739x1526'],
00178 'sinkcounter' : ['690x913x1526',
00179 '711x922x1526',
00180 '766x804x1526',
00181 '740x793x1526'],
00182 'robotcounter' : ['819x1201x1525',
00183 '909x1240x1525',
00184 '920x1218x1525',
00185 '828x1179x1525'],
00186 'firsttable' : ['976x1501x1525',
00187 '1016x1518x1525',
00188 '1026x1490x1525',
00189 '989x1474x1525'],
00190 'secondtable' : ['950x1554x1525',
00191 '991x1573x1525',
00192 '1003x1546x1525',
00193 '964x1528x1525'],
00194 'thirdtable' : ['919x1638x1525',
00195 '958x1655x1525',
00196 '969x1628x1525',
00197 '930x1612x1525'],
00198 'fourthtable' : ['866x1753x1526',
00199 '905x1772x1526',
00200 '917x1744x1526',
00201 '878x1729x1526'],
00202
00203 'longtable' : ['1007x1662x1526',
00204 '1039x1656x1526',
00205 '1102x1525x1526',
00206 '1071x1510x1526'],
00207 'laptopcounter' : ['1448x1382x1526',
00208 '1465x1390x1526',
00209 '1493x1321x1526',
00210 '1476x1314x1526'],
00211 'sailboat' : ['1385x302x1526',
00212 '1470x338x1526',
00213 '1473x317x1526',
00214 '1407x290x1526'],
00215 'printer1' : ['202x1288x1526',
00216 '217x1294x1526',
00217 '228x1272x1526',
00218 '217x1257x1526'],
00219 'printer2' : ['222x1242x1527',
00220 '240x1251x1527',
00221 '246x1234x1527',
00222 '236x1218x1527'],
00223 'mwise' : ['989x1198x1527',
00224 '1000x1199x1527',
00225 '1009x1181x1527',
00226 '998x1177x1527'],
00227
00228
00229
00230
00231 'tvcounter2' : ['506x1303x1526',
00232 '528x1256x1526',
00233 '511x1258x1526',
00234 '502x1296x1526']
00235 }
00236
00237 voxels[3] = {
00238 'pooltable' : ['581x822x1527',
00239 '624x839x1527',
00240 '658x761x1527',
00241 '620x738x1527'],
00242 'laptopcounter' : ['1435x1394x1527',
00243 '1452x1402x1527',
00244 '1479x1321x1527',
00245 '1459x1313x1527'],
00246 'sailboat' : ['1379x302x1526',
00247 '1461x336x1526',
00248 '1468x319x1526',
00249 '1388x283x1526'],
00250 'robotcounter' : ['802x1198x1526',
00251 '892x1237x1526',
00252 '901x1220x1526',
00253 '815x1180x1526'],
00254 'greenroom' : ['635x1354x1525',
00255 '678x1373x1525',
00256 '718x1286x1525',
00257 '675x1265x1525'],
00258 'firsttable' : ['967x1501x1525',
00259 '1007x1516x1525',
00260 '1018x1488x1525',
00261 '981x1473x1525'],
00262 'secondtable' : ['945x1553x1525',
00263 '982x1570x1525',
00264 '994x1543x1525',
00265 '959x1527x1525'],
00266 'thirdtable' : ['906x1636x1525',
00267 '949x1652x1525',
00268 '959x1625x1525',
00269 '918x1612x1525'],
00270 'fourthtable' : ['857x1753x1525',
00271 '898x1768x1525',
00272 '907x1743x1525',
00273 '866x1728x1525'],
00274 'farlongtable' : ['929x1798x1525',
00275 '950x1819x1525',
00276 '972x1788x1525',
00277 '941x1774x1525'],
00278 'longtable' : ['990x1692x1524',
00279 '1021x1702x1524',
00280 '1094x1521x1524',
00281 '1062x1509x1524'],
00282 'makerbot' : ['251x1126x1526',
00283 '273x1134x1526',
00284 '287x1101x1526',
00285 '278x1067x1526'],
00286 'sinkcounter' : ['685x908x1529',
00287 '704x917x1529',
00288 '732x848x1529',
00289 '716x843x1529'],
00290 'bookscounter' : ['539x1180x1527',
00291 '557x1180x1527',
00292 '572x1144x1527',
00293 '558x1146x1527'],
00294 'tvcounter' : ['494x1302x1527',
00295 '504x1301x1527',
00296 '524x1255x1527',
00297 '514x1253x1527'],
00298 'cardboard' : ['1206x286x1533',
00299 '1242x301x1533',
00300 '1246x290x1533',
00301 '1212x276x1533'],
00302 'buffet' : ['1130x1718x1537',
00303 '1146x1726x1537',
00304 '1156x1706x1537',
00305 '1141x1699x1537'],
00306 'stool1' : ['1227x1525x1528',
00307 '1240x1526x1528',
00308 '1242x1511x1528',
00309 '1229x1509x1528'],
00310 'stool2' : ['1245x1478x1528',
00311 '1259x1483x1528',
00312 '1266x1469x1528',
00313 '1251x1462x1528'],
00314 'littletable' : ['517x1271x1522',
00315 '535x1280x1522',
00316 '541x1264x1522',
00317 '523x1257x1522'],
00318 'printer1' : ['210x1242x1526',
00319 '228x1246x1526',
00320 '230x1237x1526',
00321 '219x1219x1526'],
00322 'printer2' : ['194x1272x1526',
00323 '216x1275x1526',
00324 '212x1258x1526',
00325 '208x1248x1526']
00326 }
00327
00328
00329 for name in names_rev:
00330 for k in voxels[name]:
00331 if len(voxels[name][k]) != 4:
00332 print "You have a non-square object!", name, k
00333
00334 def dex(s):
00335 '''dex for 'de-x'; convert my string format into (float, float, float).'''
00336 return [tuple([float(y) for y in x.strip().split('x')]) for x in s]
00337
00338
00339
00340
00341 lower_coordinates = ['1550x1790x1474',
00342 '1536x1778x1486',
00343 '1532x1772x1484',
00344 '1542x1740x1488']
00345
00346 upper_coordinates = ['3085x3573x1603',
00347 '3081x3569x1609',
00348 '3071x3573x1621',
00349 '3071x3573x1605']
00350
00351
00352 lcs = dex(lower_coordinates)
00353 ucs = dex(upper_coordinates)
00354
00355 del upper_coordinates
00356 del lower_coordinates
00357
00358
00359 def floatify(D):
00360 '''
00361 Turn a dictionary in my string format into a dictionary of (float, float,
00362 float) triples.
00363 '''
00364 return dict([(k, dex(D[k])) for k in D])
00365
00366 unscaled = [floatify(x) for x in voxels]
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376 def unflip_tuple_rows(t, lc, uc):
00377 '''Unflip a tuple around rows, given the appropriate bounding box.'''
00378 return (t[0], (uc[1] - lc[1]) - t[1], t[2])
00379
00380 def unflip_dict(D, lc, uc):
00381 '''As above, but for a dictionary.'''
00382 return dict([(k, [unflip_tuple_rows(t, lc, uc) for t in D[k]]) for k in D])
00383
00384 unflipped = [unflip_dict(unscaled[i], lcs[i], ucs[i]) for i in range(4)]
00385
00386
00387 def unbox_tuple(t, lc):
00388 return (t[0] + lc[0], t[1] + lc[1], t[2])
00389
00390 def unbox_dict(D, lc):
00391 return dict([(k, [unbox_tuple(t, lc) for t in D[k]]) for k in D])
00392
00393 unboxeds = [unbox_dict(unflipped[i], lcs[i]) for i in range(4)]
00394
00395
00396 OFFSET = 1500
00397 def offset_tuple(t, o):
00398 return (t[0] + o, t[1] + o, t[2] + o)
00399
00400 def offset_dict(D, o):
00401 return dict([(k, [offset_tuple(t, o) for t in D[k]]) for k in D])
00402
00403 offsets = [offset_dict(D, -OFFSET) for D in unboxeds]
00404
00405
00406 SCALE = 35.0
00407 def scale_tuple(t, s):
00408 '''Divide t by s.'''
00409 return (t[0] / s, t[1] / s, t[2] / s)
00410
00411 def scale_dict(D, s):
00412 '''Divide D by s.'''
00413 return dict([(k, [scale_tuple(t, s) for t in D[k]]) for k in D])
00414
00415 meters = [scale_dict(D, SCALE) for D in offsets]