Main insight here was that with any beacon being scanned from scanners 0 and s it holds that b₀ = Tₛ + bₛ*Rₛ with b₀, bₛ being the beacons coordinates relative to 0, s resp., Tₛ is s' translation vector and Rₛ the cube rotation matrix belonging to s. This means Tₛ = b₀ - bₛ*Rₛ and we can calculate all combinations of 0's and s' beacons for all 24 cube rotations and identify the rotation Rₛ with translation Tₛ which appears at least 12 times (if this is the case). This logic is implemented in the verb tx below. J Session follows - note that after reading in the data, first the 24 cube rotations are constructed:
rd=: {{ ([: ".&.:> }.);._2 ,&a: <;._2 rplc&('-';'_') y }} ]d=: rd 0 : 0 --- scanner 0 --- 404,-588,-901 528,-643,409 -838,591,734 390,-675,-793 -537,-823,-458 -485,-357,347 -345,-311,381 -661,-816,-575 -876,649,763 -618,-824,-621 553,345,-567 474,580,667 -447,-329,318 -584,868,-557 544,-627,-890 564,392,-477 455,729,728 -892,524,684 -689,845,-530 423,-701,434 7,-33,-71 630,319,-379 443,580,662 -789,900,-551 459,-707,401 --- scanner 1 --- 686,422,578 605,423,415 515,917,-361 -336,658,858 95,138,22 -476,619,847 -340,-569,-846 567,-361,727 -460,603,-452 669,-402,600 729,430,532 -500,-761,534 -322,571,750 -466,-666,-811 -429,-592,574 -355,545,-477 703,-491,-529 -328,-685,520 413,935,-424 -391,539,-444 586,-435,557 -364,-763,-893 807,-499,-711 755,-354,-619 553,889,-390 --- scanner 2 --- 649,640,665 682,-795,504 -784,533,-524 -644,584,-595 -588,-843,648 -30,6,44 -674,560,763 500,723,-460 609,671,-379 -555,-800,653 -675,-892,-343 697,-426,-610 578,704,681 493,664,-388 -671,-858,530 -667,343,800 571,-461,-707 -138,-166,112 -889,563,-600 646,-828,498 640,759,510 -630,509,768 -681,-892,-333 673,-379,-804 -742,-814,-386 577,-820,562 --- scanner 3 --- -589,542,597 605,-692,669 -500,565,-823 -660,373,557 -458,-679,-417 -488,449,543 -626,468,-788 338,-750,-386 528,-832,-391 562,-778,733 -938,-730,414 543,643,-506 -524,371,-870 407,773,750 -104,29,83 378,-903,-323 -778,-728,485 426,699,580 -438,-605,-362 -469,-447,-387 509,732,623 647,635,-688 -868,-804,481 614,-800,639 595,780,-596 --- scanner 4 --- 727,592,562 -293,-554,779 441,611,-461 -714,465,-776 -743,427,-804 -660,-479,-426 832,-632,460 927,-485,-438 408,393,-506 466,436,-512 110,16,151 -258,-428,682 -393,719,612 -211,-452,876 808,-476,-593 -575,615,604 -485,667,467 -680,325,-822 -627,-443,-432 872,-547,-609 833,512,582 807,604,487 839,-516,451 891,-625,532 -652,-548,-490 30,-46,-14 ) +--------------+--------------+--------------+--------------+--------------+ | 404 _588 _901| 686 422 578| 649 640 665|_589 542 597| 727 592 562| | 528 _643 409| 605 423 415| 682 _795 504| 605 _692 669|_293 _554 779| |_838 591 734| 515 917 _361|_784 533 _524|_500 565 _823| 441 611 _461| | 390 _675 _793|_336 658 858|_644 584 _595|_660 373 557|_714 465 _776| |_537 _823 _458| 95 138 22|_588 _843 648|_458 _679 _417|_743 427 _804| |_485 _357 347|_476 619 847| _30 6 44|_488 449 543|_660 _479 _426| |_345 _311 381|_340 _569 _846|_674 560 763|_626 468 _788| 832 _632 460| |_661 _816 _575| 567 _361 727| 500 723 _460| 338 _750 _386| 927 _485 _438| |_876 649 763|_460 603 _452| 609 671 _379| 528 _832 _391| 408 393 _506| |_618 _824 _621| 669 _402 600|_555 _800 653| 562 _778 733| 466 436 _512| | 553 345 _567| 729 430 532|_675 _892 _343|_938 _730 414| 110 16 151| | 474 580 667|_500 _761 534| 697 _426 _610| 543 643 _506|_258 _428 682| |_447 _329 318|_322 571 750| 578 704 681|_524 371 _870|_393 719 612| |_584 868 _557|_466 _666 _811| 493 664 _388| 407 773 750|_211 _452 876| | 544 _627 _890|_429 _592 574|_671 _858 530|_104 29 83| 808 _476 _593| | 564 392 _477|_355 545 _477|_667 343 800| 378 _903 _323|_575 615 604| | 455 729 728| 703 _491 _529| 571 _461 _707|_778 _728 485|_485 667 467| |_892 524 684|_328 _685 520|_138 _166 112| 426 699 580|_680 325 _822| |_689 845 _530| 413 935 _424|_889 563 _600|_438 _605 _362|_627 _443 _432| | 423 _701 434|_391 539 _444| 646 _828 498|_469 _447 _387| 872 _547 _609| | 7 _33 _71| 586 _435 557| 640 759 510| 509 732 623| 833 512 582| | 630 319 _379|_364 _763 _893|_630 509 768| 647 635 _688| 807 604 487| | 443 580 662| 807 _499 _711|_681 _892 _333|_868 _804 481| 839 _516 451| |_789 900 _551| 755 _354 _619| 673 _379 _804| 614 _800 639| 891 _625 532| | 459 _707 401| 553 889 _390|_742 _814 _386| 595 780 _596|_652 _548 _490| | | | 577 _820 562| | 30 _46 _14| +--------------+--------------+--------------+--------------+--------------+ mm=: +/ .* NB. Matrix multiplication 'x y z'=: I=: e.@i. 3 NB. Unit vectors Z=: (y,(-x),:z) mm^:(i.4) I NB. 4 rotations around z-axis NB. R ~ Matrix representations of all 24 cube rotations $R=: ,/ ((z,y,:-x) mm^:(i.4) I) mm"2/ Z 16 3 3 $R=: R, ,/ ((x,z,:-y) mm^:(1 3) I) mm"2/ Z 24 3 3 B=: 0{::d NB. Beacons relative to scanner 0 S=: }. i. #d NB. Remaining scanners' indices T=: 0 0 0 $~ 3,~ #d NB. Scanners' translation vectors ol=: ~. #~ [: 12&<: #/.~ NB. Check for 12 overlapping beacons NB. tx ~ for scanner y=s calculate all possible translations Tₛ NB. with b₀ = Tₛ + bₛ*Rₛ => Tₛ = b₀ - bₛ*Rₛ and identify NB. the one with 12 overlapping beacons - if available tx=: {{ ol&.> ;/ ,/"3 B -"1/"2 (y{::d) mm"1/"2 R }}"0 3 : 0 '' NB. Apply tx to all remaining scanners S and identify those while. 0<$S do. NB. with 12 overlaps - s is the 1st and has rotation r{R s=. {&S {. 'i r'=. {. ($ #: I.@,) 1&= #&>X=. tx S T=: (,(<i,r){::X) s} T NB. Store translation vector Tₛ B=: ~. B, (s{T) +"1 (r{R) mm"1/"2~ s{::d NB. Update B with s' beacons S=: S -. s NB. Drop s from scanners S end. ) # B NB. (*) 79 >./ ,([: +/ |@-)"1/~ T NB. (**) 3621 ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm