<?xml version="1.0"?>
<!DOCTYPE activity SYSTEM "escot.dtd" >
<activity name="Scale n' Bowl Part 1" size="634,378" puzzle_id="5">
  <page name="Decimal Alleys">
    <component class="com.sri.escot.NumberEntry" position="301,267" size="59,19" portid="NumberEntry-1">
      <property name="label" value=""/>
      <property name="exporting" value="false"/>
      <property name="suffix" value=""/>
      <property name="maximumDecimalPlaces" value="3"/>
      <property name="value" value="20.0"/>
      <property name="name" value="number"/>
      <property name="allowNegative" value="true"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="editable" value="false"/>
    </component>
    <component class="com.sri.escot.NumberEntry" position="543,267" size="63,19" portid="NumberEntry-2">
      <property name="label" value=""/>
      <property name="exporting" value="false"/>
      <property name="maximumDecimalPlaces" value="3"/>
      <property name="suffix" value=""/>
      <property name="value" value="20.0"/>
      <property name="name" value="number"/>
      <property name="allowNegative" value="true"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="editable" value="false"/>
    </component>
    <component class="org.escot.demo.ButtonPanel" position="363,320" size="211,29" portid="ButtonPanel-3">
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.javascript.JavaScript" position="13,243" size="73,25" portid="JavaScript-1">
      <![CDATA[scalebowlaction = new
EscotAction("Scale and Bowl")
addExport(scalebowlaction)
addExport(new EscotAction("Reset"))

maxRatio = 5
maxExceededString = "The ball is too big."

alleyNumber = new EscotNumber("alleyNumber", 1)
addExport(alleyNumber)

scaledRadius = new
EscotNumber("scaledRadius",20)
addExport(scaledRadius)

// limitedRadius is not set if max ratio exceeded
limitedRadius = new EscotNumber("limitedRadius", 20)
addExport(limitedRadius)

// number exported to bowl counter
bowlCount = new EscotNumber("bowlCount", 0)
addExport(bowlCount)

// counters for each alley
bowlCount1 = 0
bowlCount2 = 0
bowlCount3 = 0
bowlCount4 = 0
bowlCount5 = 0

message = new EscotString("message","")
addExport(message)

pinHalfDistance = new
EscotNumber("pinHalfDistance", 39.5)
addExport(pinHalfDistance)
barrierHalfDistance = new
EscotNumber("barrierHalfDistance", 40.5)
addExport(barrierHalfDistance)

// actions to configure the sketch
configAlley1 = new EscotAction("Alley #1")
configAlley2 = new EscotAction("Alley #2")
configAlley3 = new EscotAction("Alley #3")
configAlley4 = new EscotAction("Alley #4")
configAlley5 = new EscotAction("Alley #5")

addExport(configAlley1)
addExport(configAlley2)
addExport(configAlley3)
addExport(configAlley4)
addExport(configAlley5)

// export for resetting the scaling ratio
myFraction = new EscotNumber("fractionOut", 1)
addExport(myFraction)

addImporter(new
EscotNumberImporter("originalRadius"))
addImporter(new
EscotNumberImporter("fraction"))
addImporter(new
EscotActionImporter("gspBowl"))
addImporter(new
EscotActionImporter("gspReset"))

needsReset = false

function performed(action) {
	if (action.name == scalebowlaction.name) {
		if (needsReset) {
			message.value = "Please Reset the lanes before bowling"
		} else if (fraction.value > maxRatio) {
			message.value = maxExceededString
			scaledRadius.value = originalRadius.value * fraction.value
		} else {
			message.value = ""
			if (alleyNumber.value == 1) 
				bowlCount.value = ++bowlCount1
			else if (alleyNumber.value == 2)
				bowlCount.value = ++bowlCount2
			else if (alleyNumber.value == 3)
				bowlCount.value = ++bowlCount3
			else if (alleyNumber.value == 4)
				bowlCount.value = ++bowlCount4
			else if (alleyNumber.value == 5)
				bowlCount.value = ++bowlCount5
			scaledRadius.value = originalRadius.value * fraction.value
			limitedRadius.value = scaledRadius.value
			if (gspBowl)
			{
				gspBowl.perform()
			}
			needsReset = true
		}
	} else if (action.name == configAlley1.name) {
		CompleteReset()
		alleyNumber.value = 1
		bowlCount.value = bowlCount1
		pinHalfDistance.value = 39.5
		barrierHalfDistance.value = 40.5
	} else if (action.name == configAlley2.name) {
		CompleteReset()
		alleyNumber.value = 2
		bowlCount.value = bowlCount2
		pinHalfDistance.value = 59.5
		barrierHalfDistance.value = 60.5
	} else if (action.name == configAlley3.name) {
		CompleteReset()
		alleyNumber.value = 3
		bowlCount.value = bowlCount3
		pinHalfDistance.value = 27
		barrierHalfDistance.value = 29
	} else if (action.name == configAlley4.name) {
		CompleteReset()
		alleyNumber.value = 4
		bowlCount.value = bowlCount4
		pinHalfDistance.value = 15.8
		barrierHalfDistance.value = 17
	} else if (action.name == configAlley5.name) {
		CompleteReset()
		alleyNumber.value = 5
		bowlCount.value = bowlCount5
		pinHalfDistance.value = 6.6
		barrierHalfDistance.value = 7.6
	}
}

// synchronize our local associate with foreign one
function fractionChanged() {
	myFraction.value = fraction.value
}

// resets ball size and lanes
function CompleteReset() {
	myFraction.value = 1
	scaledRadius.value = originalRadius.value
	limitedRadius.value = scaledRadius.value
	ResetPerformed()
}

// resets lanes
function ResetPerformed() {
	needsReset = false
	message.value = ""
	if (gspReset)
{
		gspReset.perform()
	}
}


]]>
    </component>
    <component class="SketchpadBean2" position="293,40" size="334,221" portid="SketchpadBean2-1">{1} Point(515,31)[hidden];
{2} Point(495,31)[hidden];
{3} Point(497,65)[hidden];
{4} Point(517,65)[hidden];
{5} Point(493,104)[hidden];
{6} Point(510,104)[hidden];
{7} Point(496,142)[hidden];
{8} Point(536,149)[hidden];
{9} Point(538,184)[hidden];
{10} Point(499,177)[hidden];
{11} Point(498,214)[hidden];
{12} Point(586,214)[hidden];
{13} Point(71,111)[hidden];
{14} Point(243,111)[hidden];
{15} Point(506,253)[hidden];
{16} Point(563,253)[hidden];
{17} Point(500,292)[hidden];
{18} Point(524,296)[hidden];
{19} Point(454,364)[hidden];
{20} Point(506,335)[hidden];
{21} Point(537,332)[hidden];
{22} Segment(1,2)[hidden,black];
{23} Segment(4,3)[hidden,black];
{24} Segment(6,5)[hidden,black];
{25} Segment(8,7)[hidden,black];
{26} Segment(10,9)[hidden,black];
{27} Segment(12,11)[hidden,black];
{28} Segment(14,13)[hidden,black];
{29} Segment(16,15)[hidden,blue];
{30} Segment(18,17)[hidden,blue];
{31} UnitPoint(19,10.00000000)[hidden];
{32} Line(14,13)[hidden,red];
{33} Segment(21,20)[hidden,blue];
{34} Length(22,482,20,'Original Ball Radius = ')[hidden,black];
{35} Length(24,483,93,'PinDiameter = ')[hidden,black];
{36} Parameter(25,486,129,'Barrier HalfDistance = ')[hidden,black];
{37} Parameter(26,490,168,'Pin HalfDistance = ')[hidden,black];
{38} Point on object(27,1.00000000)[hidden];
{39} Point on object(28,0.00000000)[hidden];
{40} Point on object(28,0.53600615)[hidden];
{41} Length(29,494,243,'Length(Segment Barrier Length) = ')[hidden,blue];
{42} Length(30,495,281,'BarrierWidth = ')[hidden,blue];
{43} Origin&amp;Unit(19,31)[hidden,red];
{44} Point on object(28,1.00000000)[hidden];
{45} Parameter(23,483,53,'BallRadius = ')[hidden,black];
{46} Point on object(33,0.73608202)[hidden];
{47} HideButton(478,337,'Hide')(28)[hidden,cyan];
{48} Translation/FixedAngle/MarkedDistance(13,34,2.35619450)[hidden];
{49} Translation/FixedAngle/MarkedDistance(39,34,2.35619450)[hidden];
{50} HideButton(511,370,'Hide')(45,2,1,22,34)[hidden,red];
{51} ShowButton(15,128,'Show')(45,2,1,22,34)[hidden,red];
{52} Translation/FixedAngle/MarkedDistance(13,45,2.35619450)[hidden];
{53} HideButton(15,86,'Hide')(44)[hidden,green];
{54} ShowButton(15,65,'Show')(44)[hidden,green];
{55} Ratio/Points(11,12,38,366,256,'Ratio(IL/IJ) = ')[hidden,black];
{56} MoveButton(322,356,0,'Reset Lanes')(13,39)[hidden,blue];
{57} Perpendicular(28,40)[hidden,blue];
{58} Translation/FixedAngle/MarkedDistance(40,36,0.00000000)[hidden];
{59} AxisX(43)[hidden,red];
{60} AxisY(43)[hidden,red];
{61} Coordinates(14,43,632,419,'DestIfClears:')[hidden,red];
{62} Translation/FixedAngle/MarkedDistance(44,37,0.00000000)[hidden];
{63} Perpendicular(32,44)[hidden,red];
{64} Ratio/Points(13,14,39,379,608,'Ratio(OriginO/OriginDestIfClears) = ')[hidden,black];
{65} ShowButton(503,503,'Show')(44)[hidden,yellow];
{66} HideButton(503,524,'Hide')(44)[hidden,yellow];
{67} Calculate(543,577,'BallHitsPins = ','1.0000000000 AB/1.0000000000 -@sgn_+@sgn_')(45,37)[hidden,yellow];
{68} Calculate(312,350,'(Barrier HalfDistance)/BallRadius = ','AB/')(36,45)[hidden,red];
{69} Translation/FixedAngle/MarkedDistance(39,45,2.35619450)[hidden];
{70} Ratio/Points(20,21,46,496,320,'Hilight Offset = ')[hidden,red];
{71} Circle(13,48)[red];
{72} Calculate(490,205,'PinTravelStrength = ','5.0000000000 A*')(55)[hidden,suffix('x'),black];
{73} Circle(40,58)[hidden,blue];
{74} Circle(44,62)[hidden,red];
{75} Circle(39,69)[hidden,green];
{76} Calculate(579,499,'ballClearsBarrier = ','1.0000000000 A1.0000000000 -@sgn_+@sgn_')(68)[hidden,red];
{77} Calculate(48,650,'BallHitsPins*(BallRadius + PinDiameter/2) + (1 - BallHitsPins)*2000pix = ','ABC2.0000000000 /+*1.0000000000 A-2000.0000000000 *+')(67,45,35)[hidden,yellow];
{78} Segment(69,39)[hidden,red];
{79} Intersect1(57,73)[hidden];
{80} Intersect1(63,74)[hidden];
{81} HideButton(503,441,'Tidy for JSP Export')(28,40,13,39,14,3,4,23,45,5,6,24,35,7,8,25,36,9,10,26,37,11,12,27,38,72,15,16,29,17,18,30,41,42,76,32)[hidden,red];
{82} Circle interior(75)[blue];
{83} Calculate(88,421,'ballClearsBarrier*(2*(Barrier HalfDistance)) + (1 - ballClearsBarrier)*BallRadius = ','A2.0000000000 B**1.0000000000 A-C*+')(76,36,45)[hidden,red];
{84} Midpoint(78)[hidden];
{85} Circle by radius(80,24)[hidden,red];
{86} Translation/FixedAngle/MarkedDistance(79,42,0.00000000)[hidden];
{87} Translation/FixedAngle/MarkedDistance(79,41,0.00000000)[hidden];
{88} Perpendicular(57,79)[hidden,blue];
{89} Translation/FixedAngle/MarkedDistance(79,45,0.00000000)[hidden];
{90} Translation/FixedAngle/MarkedDistance(79,83,0.00000000)[hidden];
{91} Dilation/MarkedRatio(69,84,70)[hidden];
{92} Intersect1(63,85)[hidden];
{93} Circle(79,86)[hidden,blue];
{94} Circle(79,87)[hidden,blue];
{95} Circle(79,90)[hidden,red];
{96} Circle(84,91)[hidden,red];
{97} Segment(80,92)[hidden,red];
{98} Intersect1(57,93)[hidden];
{99} Intersect1(32,95)[hidden,label('DestIfBlocked')];
{100} Circle interior(96)[cyan];
{101} Midpoint(97)[hidden];
{102} Segment(98,79)[black];
{103} Perpendicular(57,98)[hidden,blue];
{104} Coordinates(99,43,407,412,'Coordinate(Point DestIfBlocked): ')[hidden,red];
{105} Circle(101,80)[hidden,black];
{106} Reflection(102,28)[black];
{107} Perpendicular(103,87)[hidden,blue];
{108} Translation/FixedAngle/MarkedDistance(101,77,0.00000000)[hidden];
{109} Calculate(221,431,'ballClearsBarrier*x[DestIfClears] + (1 - ballClearsBarrier)*x[DestIfBlocked] = ','A#B1*1.0000000000 A-#C1*+')(76,61,104)[hidden,red];
{110} Calculate(221,453,'ballClearsBarrier*y[DestIfClears] + (1 - ballClearsBarrier)*y[DestIfBlocked] = ','A#B2*1.0000000000 A-#C2*+')(76,61,104)[hidden,red];
{111} Intersect(88,107)[hidden];
{112} Intersect(103,107)[hidden];
{113} Circle(101,108)[hidden,green];
{114} PlotXY(110,43,109)[hidden];
{115} Polygon(112,98,79,111)[green];
{116} Segment(79,111)[black];
{117} Segment(111,112)[black];
{118} Segment(112,98)[black];
{119} Intersect1(32,113)[hidden,label('PinHit')];
{120} MoveButton(15,44,40.0,'Bowl')(114,39)[hidden,red];
{121} MoveButton(177,358,1,'Bowl')(114,39)[hidden,black];
{122} Reflection(115,28)[green];
{123} Reflection(117,28)[black];
{124} Reflection(116,28)[black];
{125} Reflection(118,28)[black];
{126} Ratio/Points(13,14,119,366,648,'Ratio(OriginPinHit/OriginDestIfClears) = ')[hidden,green];
{127} Distance(39,119,149,504,'Distance(PinHit to O) = ')[hidden,green];
{128} Ray(101,119)[hidden,green];
{129} HideButton(490,461,'Hide')(121,56)[hidden,yellow];
{130} ShowButton(490,379,'Show')(121,56)[hidden,yellow];
{131} Calculate(3,557,'sgn[1 + sgn[(Ratio(OriginO/OriginDestIfClears)) - (Ratio(OriginPinHit/OriginDestIfClears))]] = ','1.0000000000 AB-@sgn_+@sgn_')(64,126)[hidden,green];
{132} Calculate(80,621,'(sgn[1 + sgn[(Ratio(OriginO/OriginDestIfClears)) - (Ratio(OriginPinHit/OriginDestIfClears))]])*BallHitsPins = ','AB*')(131,67)[hidden,green];
{133} Calculate(21,46,'Distance(PinHit to O)*PinTravelStrength*((sgn[1 + sgn[(Ratio(OriginO/OriginDestIfClears)) - (Ratio(OriginPinHit/OriginDestIfClears))]])*BallHitsPins) = ','AB*C*')(127,72,132)[hidden,green];
{134} Calculate(21,90,'1pix + (Distance(PinHit to O)*PinTravelStrength*((sgn[1 + sgn[(Ratio(OriginO/OriginDestIfClears)) - (Ratio(OriginPinHit/OriginDestIfClears))]])*BallHitsPins)) = ','1.0000000000 A+')(133)[hidden,green];
{135} Translation/FixedAngle/MarkedDistance(101,134,0.00000000)[hidden];
{136} Circle(101,135)[hidden,green];
{137} Intersect2(128,136)[hidden];
{138} Intersect1(97,136)[hidden];
{139} VectorTranslation(105,101,137)[black];
{140} Circle interior(139)[red];
{141} Reflection(139,32)[black];
{142} Reflection(140,32)[red];
<property name="SketchBackColor" value="255,255,204"/>
    </component>
    <component class="com.sri.escot.NumberEntry" position="417,267" size="53,19" portid="NumberEntry-3">
      <property name="maximumDecimalPlaces" value="3"/>
      <property name="label" value=""/>
      <property name="value" value="1.0"/>
      <property name="allowNegative" value="false"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="suffix" value=""/>
      <property name="editable" value="true"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="298,291" size="73,16">
      <property name="text" value="&#60;html>&#60;font size=&#34;-1&#34;>Ball Radius&#60;/font>&#60;/html>"/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="380,270" size="22,15">
      <property name="text" value="X"/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="501,271" size="21,15">
      <property name="text" value="="/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="404,290" size="84,18">
      <property name="text" value="&#60;html>&#60;font size=&#34;-1&#34;>Scaling Ratio&#60;/font>&#60;/html>"/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="526,291" size="103,18">
      <property name="text" value="&#60;html>&#60;font size=&#34;-1&#34;>New Ball Radius&#60;/font>&#60;/html>"/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="org.escot.demo.TextEditor" answerText="true" position="6,228" size="273,145" portid="TextEditor-1">
      <![CDATA[
Your solution here]]>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="229,255,255"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="org.escot.demo.HTMLViewer" position="5,7" size="273,215" portid="HTMLViewer-1">
      <![CDATA[
<html>
<body>
Find a scaling ratio in the form of a decimal (e.g. 0.5) that will enlarge 
or reduce the blue ball to fit through the green bowling alley and move the 
two red pins.
<br>1. For each of the 5 alleys, please explain the scaling ratios you tried, why you tried them, and which one worked. 
<br>2. After you have bowled all 5 alleys, put the scaling ratios which worked in order from smallest to largest 
and tell us how you chose this order.
</body>
</html>
]]>
    </component>
    <component class="com.sri.escot.NumberEntry" position="553,7" size="76,19" portid="NumberEntry-4">
      <property name="maximumDecimalPlaces" value="0"/>
      <property name="label" value=""/>
      <property name="value" value="0.0"/>
      <property name="allowNegative" value="false"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="suffix" value="bowls"/>
      <property name="editable" value="false"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="381,292" size="17,15">
      <property name="text" value="X"/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="502,291" size="21,15">
      <property name="text" value="="/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="org.escot.demo.StringView" position="345,356" size="257,16" portid="StringView-1">
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.ActionMenu" position="380,5" size="165,23" portid="ActionMenu-1">
      <property name="label" value="Choose another alley..."/>
      <property name="font" value="SansSerif,SansSerif,1,10"/>
    </component>
    <component class="com.sri.escot.NumberEntry" position="298,8" size="65,19" portid="NumberEntry-5">
      <property name="maximumDecimalPlaces" value="0"/>
      <property name="label" value="Alley #"/>
      <property name="value" value="1.0"/>
      <property name="allowNegative" value="false"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="suffix" value=""/>
      <property name="editable" value="false"/>
    </component>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Scale and Bowl"/>
      <to portid="ButtonPanel-3" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="scaledRadius"/>
      <to portid="NumberEntry-2" name="number"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="limitedRadius"/>
      <to portid="SketchpadBean2-1" name="BallRadius = "/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="pinHalfDistance"/>
      <to portid="SketchpadBean2-1" name="Pin HalfDistance = "/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="barrierHalfDistance"/>
      <to portid="SketchpadBean2-1" name="Barrier HalfDistance = "/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="NumberEntry-3" name="number"/>
      <to portid="JavaScript-1" name="fraction"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="fractionOut"/>
      <to portid="NumberEntry-3" name="number"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="NumberEntry-1" name="number"/>
      <to portid="JavaScript-1" name="originalRadius"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="SketchpadBean2-1" name="Reset Lanes"/>
      <to portid="JavaScript-1" name="gspReset"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="SketchpadBean2-1" name="Bowl"/>
      <to portid="JavaScript-1" name="gspBowl"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="bowlCount"/>
      <to portid="NumberEntry-4" name="number"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Reset"/>
      <to portid="ButtonPanel-3" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="message"/>
      <to portid="StringView-1" name="StringView"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Alley #1"/>
      <to portid="ActionMenu-1" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Alley #2"/>
      <to portid="ActionMenu-1" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Alley #3"/>
      <to portid="ActionMenu-1" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Alley #4"/>
      <to portid="ActionMenu-1" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Alley #5"/>
      <to portid="ActionMenu-1" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="alleyNumber"/>
      <to portid="NumberEntry-5" name="number"/>
    </wire>
  </page>
</activity>

