*** Stonehenge Circle Accuracy Slot Calculator Example *** This page is under development. Comments are welcome, but please load any comments in the comments section at the middle of the page. Thanks,[gold] ---- [gold] Here is an eTCL script on to estimate Stonehenge Circle Accuracy. For the push buttons, the recommended procedure is push testcase and fill frame, change entries , push solve, and then push report. Report allows copy and paste from console, but takes away from computer "efficiency". ---- The accuracy of Stonehenge is essentially the delta or divergence between the poles over the line of sight distance. For a simple circle of aligned poles, the line of sight distance is treated as the diameter. Later circles or more complex monuments had added causeways to the original line of sight. So the calculator has a causeway length added, if not zero. While the testcases below are in meters, the units cancel out in the accuracy equation. So the units could entered as inches, feet, cubits, or chinese inches. This is an advantage since the units in the ancient Sumerian, Indian, and Chinese texts are open to question. Two or three angular points are needed at a minimum for the divergence, so doorways, doorposts, postholes, columns, and windows measures are usable. Note that the solar and lunar disks have an apparent diameter of 0.5 degrees, so the Stonehenge resolution or accuracy of 0.5 degrees might be expected. ====== pseudocode: accuracy = delta (divergence) over the line of sight distance pseudocode: accuracy in radians = atan ( delta over the line of sight distance ) pseudocode: accuracy in degrees = (180. degrees / pi radians) * atan(ratio) pseudocode: load results into answer fields ====== For most numerical programs, an important work is assembling the testcases, using hand calculators and results of other computer programs. With the TCL console, it is easy enough to write little test programs or demos of the equations or algorithms used. Testcase 1 Stonehenge phase1, Audrey holes. %|quantity|number|units|% &|diameter|114|meters|& &|pole divergence|1|meters|& &|answer|.009|radians|& &|answer|.5|degrees|& 2900 and 2600 bc Testcase 2 buried Wooden circle , adjacent and possibly contemporary to Stonehenge 2. %|quantity|number|units|% &|diameter|75|meters|& &|pole divergence|1|meters|& &|answer|.01|radians|& &|answer|.76|degrees|& ---- Testcase 3 Conjectures on world wide, not many as well preserved or documented as Stonehenge. %|quantity| | | | |||% %|stone circle/structure|diameter|units|pole separation|units|accuracy|units|website|% &|Stonehenge phase1, Audrey holes,UK|114|meters|1|meters|.5|degrees|http://en.wikipedia.org/wiki/Stone_Henge|& &|Wooden circle,Stonehengephase2,UK|75|meters|1.|meters|.76|degrees|http://en.wikipedia.org/wiki/Stone_Henge|& &|Bluehenge,UK|18.2|meters|4.?|meters|12.3?|degrees|http://en.wikipedia.org/wiki/Bluestonehenge|& &|Thornborough,UK|240|meters|4.?|meters|1.?|degrees|http://en.wikipedia.org/wiki/Thornborough_Henges|& &|Goodaver,Bodmin Moor,Cornwall|32.3|meters|3.7|meters|6.53|degrees|http://en.wikipedia.org/wiki/Goodaver_stone_circle|& &|Grey Wethers,Dartmoor|32|meters|4.5|meters|8.0|degrees|http://en.wikipedia.org/wiki/Grey_Wethers|& &|Castilerigg|30|meters|2.35?|meters|4.5|degrees|http://en.wikipedia.org/wiki/Castlerigg_stone_circlehttp://|& &|Ring of Brogar,Orkney,scotland|103.7|meters|0.8297|meters|0.458|degrees|http://en.wikipedia.org/wiki/Ring_of_Brodgar|& &|Chankillo Solar obs.,Peru|235|meters|4.9|meters|1.19|degrees|http://en.wikipedia.org/wiki/Chankillo|& &|Xiangfen,Shanxii,China|60|meters|1.4|meters|1.33|degrees|http://en.wikipedia.org/wiki/Taosi|& &|Newark Great Circle,Ohio,USA|360|meters|4.?|meters|.63?|degrees|http://en.wikipedia.org/wiki/Newark_Earthworks|& &|Hopeton Earthwork Circle,Ohio,USA|320|meters|4.?|meters|.72?|degrees|http://en.wikipedia.org/wiki/Hopeton_Earthworks|& &|Fort Center, Florida,USA|362|meters|4.?|meters|.63?|degrees|http://en.wikipedia.org/wiki/Fort_Center|& &|Rujm_el-Hiri,Israel|160|meters|26|meters|9.2|degrees|http://en.wikipedia.org/wiki/Rujm_el-Hiri|& &|Tiwanaku Calendar Stones,Bolivia, South America|49.3?|meters|4.845|meters|5.6|degrees|http://en.wikipedia.org/wiki/Tiwanaku|& ---- The stonehenge audrey holes seem to measure 0.5 degrees. At least some stone circles have a diameter of 32 meters and appear to measure 6/360 part of the sky. Some of medicine wheels in North America have divisions of 28. ---- At Tiwanaku, the viewing of solar travel across a wall appears to show 1/20 part of a year from station to station. In this case, the calculator shows an average travel of 5.6 degrees from station to station. While the apparent solar setting has a nonlinear speed over a years time, it is a fascinating concept of a day to day clock. ---- ***Screenshots Section*** [http://img690.imageshack.us/img690/4333/stonetclwiki.gif] [http://img87.imageshack.us/img87/332/image50.gif] due to size and attribution of following jpegs, leaving them as point and shoot * http://commons.wikimedia.org/wiki/File:Stonehenge_plan.jpg * http://commons.wikimedia.org/wiki/File:Sun_behind_the_Heel_Stone.jpg * http://commons.wikimedia.org/wiki/File:Stonehenge_from_north,_August_2010,_cropped.jpg * http://commons.wikimedia.org/wiki/File:Stonehenge_vid_midsommar_1700_f_Kr,_Nordisk_familjebok.png * http://commons.wikimedia.org/wiki/File:Stonehenge_Closeup.jpg * http://commons.wikimedia.org/wiki/File:Oshoro_Stone_Circle.jpg world wide * http://commons.wikimedia.org/wiki/File:Wassu_stone_circle.jpg * http://commons.wikimedia.org/wiki/File:Castlerigg_stone_circle.jpg * http://commons.wikimedia.org/wiki/File:Beltany_stone_circle.jpg * http://commons.wikimedia.org/wiki/File:Zorats_Karer_2008,_part_of_the_interior.jpg * http://commons.wikimedia.org/wiki/File:MedicineWheel.jpg * http://commons.wikimedia.org/wiki/File:Bighorn_medicine_wheel.jpg * http://commons.wikimedia.org/wiki/File:Medizinrad.jpg * http://commons.wikimedia.org/wiki/File:Calendar_aswan.JPG * http://commons.wikimedia.org/wiki/File:Megaliths_Aswan_Nubia_museum.JPG * http://commons.wikimedia.org/wiki/File:Nabta.gif ---- '''Comments Section''' Please place any comments here, Thanks. Note, compare the visual style of this new page you have created to other wiki pages on this wiki. Notice how your pages are not in keeping with the high standards of formatting and presentation on the remainder of this wiki. To be a good community member, you should also strive to maintain the existing high quality standards for formatting and presentation as presented on the remainder of this wiki. To do otherwise makes yourself, and the whole wiki community, look bad. You can read the [Formatting Rules] page for details on how to format your submissions, and you can look at existing page formatting for clues as to how something was done. You can even look at some of your own pages that have been reformatted to see how to make the necessary changes. [gold] With respect, I have pretty printed my TCL code from the ased editor, what is free and available on the PC for a recognized TCL format. If you have got a mechanized css format like google and most editors, I'll be happy to print from that. eg. http://google-code-prettify.googlecode.com/svn/trunk/README.html http://code.google.com/chrome/devtools/docs/elements-styles.html The Ased output is at least referenced on the wiki style page, if not blessed. Ref the discussion on [Tcl Style Guide]. Thank you. Your code at the bottom of this page is neatly formatted, as is your wiki page itself now, both of which are very welcome changes. A few tips: 1. If you surround your code blocks with a pair of line containing only six equals signs ("======") with the first equals sign beginning in the very first column, the wiki will also automatically apply syntax highlighting to your code block for you. 1. It is conventional on the Tcl'ers wiki to refer to internal wiki pages by title alone, which can be automatically made into a link by single square bracketing the title of the page, and not by placing the explicit URL into the wiki page. I.e., do this: "[[Tcl Style Guide]]" instead of this "Tcl Style Guide, http://wiki.tcl.tk/708". 1. Beginning a set of lines with three spaces, an asterisk, and a space with the first space beginning in the very first column, will cause the wiki to automatically generate a bulleted list for you. In your references section such can be used to good effect to list external urls. 1. Much of the wiki formatting commands operate by being placed at the start of a line. Take for example your "****Appendix Code****" title just below. If you edit that line to remove all of the leading spaces, then the four asterisks will function properly and produce a proper title line, rather than a fixed width font block. One tip, when using the "======" syntax highlighting format operator, you need to put a line at '''both''' the start '''and''' at the end of the code block, i.e.: ====== proc something { x } { set y [ process $x ] } ====== Leaving out the ending "======" causes everything to not work correctly. I added the missing "======" at the bottom of your code block below so the categories operator would format properly. What is your purpose in binding the motion event on your main window to execute the wm title command. I.e., this line: ====== bind . {wm title . "Stonehenge Circle Accuracy Calculator "} ====== The result of that binding is that every time you move the mouse, the "wm title" subcommand is called repeatedly. To set the window title, you just need to call "wm title . title" once, not on every event update upon mouse pointer motion. ---- Some further tips: In your initialization loop foreach i {1 2 3 4 5 6 7 8} { ... } you link your entries to variables (the "-textvariable side$i" parameter). Because of this, you could simplify both of your fillup and clearx procs into the following (assuming Tcl 8.5): ====== proc fillup { args } { lassign $args ::side1 ::side2 ::side3 ::side4 ::side5 ::side6 ::side7 ::side8 } proc clearx { } { lassign [ lrepeat 8 {} ] ::side1 ::side2 ::side3 ::side4 ::side5 ::side6 ::side7 ::side8 } ====== Now, while this does not change the fact that side1 ... side8 are meaningless names, it does reduce the amount of duplicate code, esp. in the fillup proc. If you wanted a quick error check on fillup, you could also do this: ====== proc fillup { args } { if { [ llength $args ] != 8 } { error "fillup must be called with exactly eight arguments" } lassign $args ::side1 ::side2 ::side3 ::side4 ::side5 ::side6 ::side7 ::side8 } ====== In "calculate" you link to global variables colorwarning, colorback, answer3, side1, side2, side3, side4, side5, side6 and side7 but never make use of those variables for either reading or writing. This creates some confusion as to your intent on the part of someone else reading the proc. Did you mean to make use of them for reading/writing, and failing to read/write is an error? Or did you simply link to them unnecessarially, and so they are added noise to read past while analyzing the proc? Generally, it is best to only link to just those variables that are read/written by the procedure, as that makes your intent as author clear. Further in "calculate", you "set answer2 5" to set the answer2 variable to 5, then immediately set answer2 to the return from circle5, which does not make use of "answer2" to calculate a result. This is at best superflourous, as setting answer2 to 5 to immediately set it to a new value makes the first set nonsense. At worse, given your use of globals for passing around data between procs, it is highly confusing because one has to go and read circle5 carefully to see if it makes use of the value of answer2 before determining that the set answer2 5 command is simply excess noise. So, if "set answer2 5" is simply noise as it seems, you should consider omitting that command, to make more clear what is happening within the proc. Lastly in "calculate", you set answer2 to the result of circle5 then set side8 to $answer2. The set command is defined as returning the value which is placed into the variable. By making use of this definition, you could simplify those last two lines into: ====== set side8 [ set answer2 [ circle5 $side8 ] ] ====== In your "circle5" proc, it appears that you only make use of side variables 1, 2, 3, 7 and 8. If you do not use 4, 5 and 6, you should not link to them in a "global" command because again, this creates confusion as to your intent, is the omission of use an error, or is excessive linking an error? And lastly, your use of global variables for passing around data between your procs adds confusion, as it is not clear at the site of a call to a proc just what data it will make use of during its run. Additionally, use of globals to pass around most of your proc inputs and outputs creates many possibilities for extremely subtle bugs that are very intermittent because the results of any particular proc call will depend upon more than just its inputs. For a small program like this, the chances of this happening are very low, but if you ever start to create substantially larger programs, this habit will be an extreme detriment to keeping things working properly, and to finding the source of bugs so you can eliminate them. While not all uses of global variables can be eliminated in all cases in Tcl (i.e., you do need "globals" for some instances of linkage to GUI element -textvariable parameters), attempting to minimize your use and reliance upon globals will be a useful habit to develop now, while you are still learning. This will mean that later, when you start to create larger projects, you will not have to unlearn bad habits, which will be much harder to accomplish at that point. [gold] I'm aware that fillup and the hard-wired number of variables is not the most flexible program structure, since I'm trying to reorganize the calculator in [Generic Calculator Namespace Package Example]. As to some of the coding artifacts, its not unusual for me to code a constant in the early stage of the program, where some procedures are undefined, not written, or working erractically. As to globals and side$i, some of this is meant to be a convenience in programming, but I'll think about some work around. From my study of the clay tablets, the word "side" or sag in sumerian has been used in geometry problems since 1800BCE. I could put in a pop loop to assign "reality names" to the variables. #Changed: Colorwarning, colorback, answer3 are not being used and can be removed. Moved all the calculations in proc circle5 to proc calculate. Removed three empty entries and associated variables. ---- ***References:*** * http://flintknapper.com/Woodhenge.htm * http://news.bbc.co.uk/2/hi/science/nature/434821.stm * http://cahokiamounds.org/explore/cahokia-mounds/woodhenge * http://en.wikipedia.org/wiki/Woodhenge * http://wiki.worldflicks.org/woodhenge.html * http://en.wikipedia.org/wiki/Tiwanaku * Atlantis: Lost Kingdom of the Andes by Jim Allen * http://www.atlantisbolivia.org/lostcalendarandes.htm ****Appendix Code**** ****appendix TCL programs and scripts **** ********************* ***Pretty Print VERSION *** ---- ====== # pretty print from autoindent and ased editor # stonehenge circle equation # written on Windows XP on eTCL # working under TCL version 8.5.6 and eTCL 1.0.1 # gold on TCL WIKI , 10sep2010 package require Tk frame .frame -relief flat -bg aquamarine4 pack .frame -side top -fill y -anchor center set names {{} {diameter meters:} {pole separation} {causeway length} {answer radians:} { answer degrees:} } foreach i {1 2 3 4 5 } { label .frame.label$i -text [lindex $names $i] -anchor e entry .frame.entry$i -width 35 -textvariable side$i grid .frame.label$i .frame.entry$i -sticky ew -pady 2 -padx 1 } proc about {} { set msg "Calculator for Stonehenge Circle Accuracy. from TCL WIKI, written on eTCL " tk_messageBox -title "About" -message $msg } proc pi {} {expr acos(-1)} proc calculate { } { global answer2 global side1 side2 side3 side4 side5 set term1 0 set term2 0 set term3 0 set current 0 set tanratio [expr { $side2/($side1+$side3) }] set acc [ expr { atan($tanratio) +.00000000001 } ] set side4 $acc set acc [ expr { (180./[pi])*$acc} ] set side5 $acc return $side5 } proc clearx { } { lassign [ lrepeat 5 {} ] ::side1 ::side2 ::side3 ::side4 ::side5 } proc fillup { args } { if { [ llength $args ] != 5 } { error "fillup must be called with exactly five arguments" } lassign $args ::side1 ::side2 ::side3 ::side4 ::side5 } proc reportx {} { global side1 side2 side3 side4 side5 console show; puts " $side1 " puts " $side2 " puts " $side3 " puts " $side4 " puts " $side5 " puts "answer $side5 " } frame .buttons -bg aquamarine4 ::ttk::button .calculator -text "Solve" -command { calculate } ::ttk::button .test2 -text "Testcase1" -command {clearx;fillup 114. 1. 0. .008 .5 } ::ttk::button .test3 -text "Testcase2" -command {clearx;fillup 75. 1. 0. .01 .7 } ::ttk::button .test4 -text "Testcase3" -command {clearx;fillup 114. 1. 0. .008 .5 } ::ttk::button .clearallx -text clear -command {clearx } ::ttk::button .about -text about -command about ::ttk::button .cons -text report -command { reportx } ::ttk::button .exit -text exit -command {exit} pack .calculator -in .buttons -side top -padx 10 -pady 5 pack .clearallx .cons .about .exit .test4 .test3 .test2 -side bottom -in .buttons grid .frame .buttons -sticky ns -pady {0 10} . configure -background aquamarine4 -highlightcolor brown -relief raised -border 30 wm title . "Stonehenge Circle Accuracy Calculator " ====== <> Numerical Analysis | Toys | Calculator | Example | Mathematics