package ONO::FW::Edu::Apps::Modules::Geometry;
################################################################################
# COPYRIGHT / LICENSE #
################################################################################
#
# This file is part of the ONO Software Project.
#
# Copyright (C) 2022-2026 Jos Kirps and The Joopita Project [ASBL]
# Copyright (C) 2011-2022 Jos Kirps and Joopita Research ASBL
# Copyright (C) 2006-2011 Jos Kirps and The Joopita Project
# Copyright (C) 2001-2006 Jos Kirps and The WobbleWolf Project
#
# This file, as well as many other parts of the ONO Software Project or
# related elements, are FREE SOFTWARE available under the ARTISTIC LICENSE 2.0.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# For the full license, see /ono/osr/license/LICENSE.txt, or write to
# jos_AT_kirps_DOT_com or contact_AT_joopita_DOT_com.
#
################################################################################
# END OF COPYRIGHT / LICENSE, HERE COMES THE CODE ... #
################################################################################
#: This module is a front end application module wrapper that has been
#: created for the Morzino Project (morzino.com) and that has been released
#: as Open Source software.
#:
#: Note that this is NOT a self-contained application, it is only a wrapper
#: that makes heavy use of the ONO Perl Framework application engine.
use strict;
use ONO::FW::Edu::Apps::ToolBox;
use ONO::FW::Edu::Apps::Modules::WorksheetMaker::Input;
use ONO::IO;
use ONO::FW::Apps::ToolBox;
use ONO::Lib::Image::Canvas;
use ONO::Lib::PDF::Draw;
use ONO::Lib::PDF::ToolBox;
use ONO::FW::Apps::Core;
use ONO::FW::Apps::Core::Graphics;
use ONO::Lib::Parser;
use ONO::FW::Apps::PDF;
use ONO::Lib::UI::Check;
use ONO::Lib::UI::Select;
sub learn {
my (
$self,
$option,
$vars_ref,
$HTTP,
$BASE,
) = @_;
################################################################
# INIT - BEGIN
################################################################
my (
$db,
$community,
$action_url,
$form,
$format,
$canvas,
$pdfkey,
$sec,$min,$hour,
$mday,$mon,$year,
$wday,$yday,$timestamp,
$lang,
$BLK_ref,
$vars_ref,
) = ONO::FW::Apps::Core->init($vars_ref);
my %vars = %$vars_ref;
my %BLK = %$BLK_ref;
my $app = "geometry";
ONO::FW::Apps::Core->now("",$app,$vars{'app_lang'});
my ($num_comma,$num_delimiter) = ONO::FW::Apps::Core->local_comma_delimiter(ONO::FW::Apps::Core->detect_local($vars{'app_lang'}));
my $WEB;
my $AppName = "Geometry";
my $UNIT = "cm";
my @txts = (
"types",
"perimeter",
"area",
"square",
"squares",
"rectangle",
"rectangles",
"triangle",
"triangles",
"circle",
"circles",
"also for triangles",
"formulas",
"Use the Pythagoras Theorem to calculate triangle side lengths",
"Value of π (for circles only)",
"exercises on one worksheet",
"Name figures",
"Calculate the perimeter of each figure",
"except for triangles",
"Calculate the area of each figure",
"measure",
"draw",
"side",
"length",
"height",
"radius",
"width",
"half cm (0.5)",
);
if ($vars{'app_lang'} eq "de") {
@txts = (
"Typen",
"Umfang",
"Flächeninhalt",
"Quadrat",
"Quadrate",
"Rechteck",
"Rechtecke",
"Dreieck",
"Dreiecke",
"Kreis",
"Kreise",
"auch für Dreiecke",
"Formeln",
"Benutze den Satz des Pythagoras um die Längen der Seiten des Dreiecks zu berechnen",
"Wert von π (nur für Kreise)",
"Aufgaben pro Arbeitsblatt",
"Benenne die Figuren",
"Berechne den Umfang jeder Figur",
"nicht bei Kreisen",
"Berechne den Flächeninhalt jeder Figur",
"messen",
"zeichnen",
"Seite",
"Länge",
"Höhe",
"Radius",
"Breite",
"halbe cm (0.5)",
);
}
if ($vars{'app_lang'} eq "lu") {
@txts = (
"Typen",
"Ëmfang",
"Flächeninhalt",
"Quadrat",
"Quadrater",
"Rechteck",
"Rechtecker",
"Dräieck",
"Dräiecker",
"Kreess",
"Kreesser",
"och fir Dräiecker",
"Formelen",
"Benotz de Satz vum Pythagore fir d'Längte vun de Säite vum Dräieck ze berechnen",
"Wert vu π (nëmme fir Kreesser)",
"Aufgabe pro Aarbechtsblat",
"Benenn d'Figuren",
"Berechen den Emfang vun all Figur",
"net bei Kreesser",
"Berechen de Flächeninhalt vun all Figur",
"moossen",
"zeechnen",
"Säit",
"Längt",
"Héicht",
"Radius",
"Breet",
"hallef cm (0.5)",
);
}
if ($vars{'app_lang'} eq "fr") {
@txts = (
"Types",
"perimètre",
"surface",
"carré",
"carrés",
"rectangle",
"rectangles",
"triangle",
"triangles",
"cercle",
"cercles",
"aussi pour triangles",
"formules",
"Utilisez le théorème de Pythagore pour calculer les côtés du triangle",
"Valeur de π (pour les cercles)",
"exercices par page",
"Nommez les figures",
"Calculez le périmètre de chaque figure",
"excepté triangles",
"Calculez la surface de chaque figure",
"mesurer",
"dessiner",
"coté",
"longueur",
"hauteur",
"radius",
"largeur",
"demis cm (0.5)",
);
}
$vars{'app_input_print_options_title_default'} = $AppName;
$WEB .= ONO::FW::Apps::Core->output_paper_save($pdfkey,$BLK_ref,\%vars,$HTTP,$BASE,"$year$mon$mday");
if (ONO::FW::Apps::Core->running(\%vars,$db)) {
$WEB .= ONO::FW::Apps::Core->blockbackbutton($BASE,$vars_ref);
#############################################################
# WORKSHEET MAKER
#############################################################
if ($vars{'output_worksheet_maker'}) {
$vars_ref = ONO::FW::Edu::Apps::Modules::WorksheetMaker::Input->vars(\%vars);
%vars = %$vars_ref;
}
#############################################################
# WORKSHEET MAKER MODE
#############################################################
my $worksheet_maker_mode;
if ($vars{'output_worksheet_maker'}) { # || ONO::IO->devstation) {
$worksheet_maker_mode = 1;
}
#############################################################
# ONLINE TRAINING
#############################################################
if ($vars{'output_web'} || $vars{'output_paper'}) {
if ($vars{'output_web'} && $vars{'output_web_rescramble'}) {
$vars{'output_web_question_number'}++;
foreach my $key ('name','peri','area') {
$vars{"output_web_answer_$key"} = "";
$vars{"output_web_hints_$key"} = "";
}
}
my $question_number = ONO::FW::Apps::Core->question_number($vars{'output_web_question_number'});
my (
$page,$pages,%cache,
$whilecounter,$stats_switches,
$PDF_OPTS,
$stat_correct,$stat_wrong,$stat_todo,
);
my $questions_per_page = 1;
if ($vars{'output_paper'}) {
$questions_per_page = $vars{"app_input_num_status"};
$PDF_OPTS = ONO::FW::Apps::Core->headers_options($BLK_ref,$vars_ref);
ONO::FW::Apps::PDF->new("$BASE/pdf/pdf-$pdfkey.pdf","",$format);
$vars{'app_input_multiple_questions_per_page'}++;
}
if (!$vars{'app_input_exercise_peri_tri'}) {
$txts[17] = "$txts[17] ($txts[18])";
}
if (!$vars{'app_input_precision_status'}) {
$vars{'app_input_precision_status'} = 10;
}
foreach my $copy (ONO::FW::Apps::Core->unique_copies($vars{'app_input_print_options_unique_copies'})) {
my @corr_cache;
if ($vars{'output_paper'}) {
if ($copy > 1) {
ONO::FW::Apps::PDF->page("",$format);
}
ONO::FW::Apps::Core->headers(\%vars,$format);
ONO::FW::Apps::PDF->title($vars{'app_input_print_options_title'},$PDF_OPTS,$vars{'app_input_print_options_code'},$format);
ONO::FW::Apps::Core->unique_copies_info($canvas,$copy,$vars_ref);
if ($worksheet_maker_mode) {
$questions_per_page = 2;
} else {
ONO::Lib::PDF::Draw->font('HO');
my $off_y;
foreach my $opt ('name:16','peri:17','area:19') {
my @op = split(/:/,$opt);
if ($vars{"app_input_exercise_$op[0]"}) {
ONO::Lib::PDF::Draw->text($canvas,0,$off_y,"$txts[$op[1]]!");
$off_y = $off_y + 5;
}
}
ONO::Lib::PDF::Draw->font('H');
}
# ONO::Lib::PDF::ToolBox->canvas_test($canvas);
}
if ($vars{'output_web'}) {
$WEB .= qq~<$form>~;
}
my (%used,@corr_peri,@corr_area,@corr_grid,$name,$peri,$area);
if ($vars{'output_web_completed'}) {
$vars{'output_progress_done'}++;
$WEB .= ONO::FW::Apps::Core->question_progress_done_msg($app,$db,$community,$form,$action_url,$vars{'app_input_number_of_questions'},$vars{'output_web_mistakes'},$lang,$BLK_ref,$vars_ref);
# $WEB .= ONO::FW::Apps::Core->stats("",$BLK_ref,"ctmW$stats_switches");
} else {
$WEB .= ONO::FW::Apps::Core->timer($vars{'output_web'},$vars{'output_web_timer_start'});
for (my $i = 0; $i < $questions_per_page; $i++) {
if ($vars{'app_input_precision_status'} < 10 && ($vars{'rand_half_x'} eq "" || $vars{'rand_half_y'} eq "")) {
$vars{'rand_half_x'} = 0;
$vars{'rand_half_y'} = 0;
if (int(rand(100)) > 33) {
$vars{'rand_half_x'} = 0.5;
}
if (int(rand(100)) > 33) {
$vars{'rand_half_y'} = 0.5;
}
if ($vars{'app_input_precision_status'} < 5) {
if (int(rand(100)) > 33) {
$vars{'rand_half_x'} = (1+int(rand(9)))/10;
}
if (int(rand(100)) > 33) {
$vars{'rand_half_y'} = (1+int(rand(9)))/10;
}
}
}
my @figure_max = (14,17);
my @grid = (0,20,170,190);
if ($vars{'app_input_num_status'} == 2) {
@figure_max = (14,7);
if ($i == 0) {@grid = (0,20,170,100)}
if ($i == 1) {@grid = (0,110,170,190)}
}
if ($vars{'app_input_num_status'} == 3) {
@figure_max = (14,4);
if ($i == 0) {@grid = (0,20,170,70)}
if ($i == 1) {@grid = (0,80,170,130)}
if ($i == 2) {@grid = (0,140,170,190)}
}
if ($vars{'app_input_num_status'} == 4) {
@figure_max = (6,7);
if ($i == 0) {@grid = (0,20,80,100)}
if ($i == 1) {@grid = (90,20,170,100)}
if ($i == 2) {@grid = (0,110,80,190)}
if ($i == 3) {@grid = (90,110,170,190)}
}
if ($worksheet_maker_mode) {
$vars{'app_input_num_status'} = 2;
@figure_max = (7,3);
if ($i == 0) {@grid = (5,5,85,45)}
if ($i == 1) {@grid = (90,5,170,45)}
}
if ($vars{'output_paper'}) {
if ($vars{'app_input_precision_status'} < 5) {
ONO::Lib::PDF::Draw->grid($canvas,$grid[0],$grid[1],$grid[2],$grid[3],1,0.1,"","","","lL");
ONO::Lib::PDF::Draw->grid($canvas,$grid[0],$grid[1],$grid[2],$grid[3],5,0.1,"","","","l");
} else {
ONO::Lib::PDF::Draw->grid($canvas,$grid[0],$grid[1],$grid[2],$grid[3],5,0.1,"","","","L");
}
$corr_grid[$i] = "$grid[0]:$grid[1]:$grid[2]:$grid[3]";
$vars{'variation'} = "draw";
if ($vars{'app_input_mode_measure'}) {
$vars{'variation'} = "measure";
if ($vars{'app_input_mode_draw'} && int(rand(100)) > 50) {
$vars{'variation'} = "draw";
}
}
}
my $lincolor = "dddddd";
my @commands;
for (my $x = 16; $x < 544; $x=$x+16) {
@commands = (@commands,"lin:$x,0,$x,416,1 :$lincolor:$lincolor:");
}
for (my $y = 16; $y < 416; $y=$y+16) {
@commands = (@commands,"lin:0,$y,544,$y,1 :$lincolor:$lincolor:");
}
# our canvas is 17 cm * 13 cm
my $shape_selected = $vars{'rand_shape'};
if (!$shape_selected || $vars{'output_paper'}) {
my @opts;
if ($vars{'app_input_shape_use_square'} || (!$vars{'app_input_shape_use_rectangle'} && !$vars{'app_input_shape_use_triangle'} && !$vars{'app_input_shape_use_circle'})) {
@opts = (@opts,"square");
}
if ($vars{'app_input_shape_use_rectangle'}) {
@opts = (@opts,"rectangle");
}
if ($vars{'app_input_shape_use_triangle'}) {
@opts = (@opts,"triangle");
}
if ($vars{'app_input_shape_use_circle'}) {
@opts = (@opts,"circle");
}
my $num = @opts;
$shape_selected = $opts[int(rand($num))];
$vars{'rand_shape'} = $shape_selected;
}
my $fig = $txts[3];
if ($shape_selected eq "rectangle") {
$fig = $txts[5];
}
if ($shape_selected eq "triangle") {
$fig = $txts[7];
}
if ($shape_selected eq "circle") {
$fig = $txts[9];
}
if ($shape_selected eq "square") {
if (!$vars{'rand_width'}) {
$vars{'rand_width'} = 1+int(rand(10));
}
my $width = $vars{'rand_width'};
if ($vars{'output_paper'}) {
$width = 1+int(rand($figure_max[0]));
if ($figure_max[1] < $figure_max[0]) {
$width = 1+int(rand($figure_max[1]));
}
while ($used{"square_$width"} && $whilecounter < 256) {
$whilecounter++;
$width = 1+int(rand($figure_max[0]));
if ($figure_max[1] < $figure_max[0]) {
$width = 1+int(rand($figure_max[1]));
}
}
$width = $width-$vars{'rand_half_x'};
$used{"square_$width"}++;
my ($offset_x,$offset_y) = &offset("",$width,$width,$figure_max[0],$figure_max[1],$vars{'app_input_num_status'},$i);
my @draw = ($grid[0]+$offset_x,$grid[1]+$offset_y,$grid[0]+$offset_x+($width*10),$grid[1]+$offset_y+($width*10),1);
ONO::Lib::PDF::Draw->rect($canvas,$grid[0],$grid[1]-4,$grid[2],$grid[1]+2,1,"0:0:0:0","0:244:244:244",1);
ONO::Lib::PDF::Draw->font('H',10);
if ($vars{'variation'} eq "draw") {
if ($num_comma =~ /\,/) {
$width =~ s~\.~$num_comma~g;
}
my $T1 = uc substr($txts[22],0,1);
ONO::Lib::PDF::Draw->text($canvas,$grid[0]+2,$grid[1],ucfirst "$txts[3] ($T1 = $width cm)");
} else {
ONO::Lib::PDF::Draw->text($canvas,$grid[0]+2,$grid[1],"?");
ONO::Lib::PDF::Draw->rect($canvas,@draw);
}
ONO::Lib::PDF::Draw->font('H',12);
my $peri = 4 * $width;
my $area = $width * $width;
$corr_peri[$i] = "$txts[1]: 4 x $width = $peri cm";
$corr_area[$i] = "$txts[2]: $width x $width = $area cm2";
$corr_cache[$i] = "$shape_selected:$draw[0]:$draw[1]:$draw[2]:$draw[3]:$draw[4]:";
}
$width = $width-$vars{'rand_half_x'};
my $px_width = $width * 32;
my $x = (544 - $px_width ) / 2 - $vars{'rand_half_x'}*16;
my $y = (416 - $px_width ) / 2 - $vars{'rand_half_x'}*16;
my $tx1 = $x + ($px_width/2);
my $ty1 = $y - 8;
my $tx2 = $x + $px_width + 8;
my $ty2 = $y + ($px_width/2);
@commands = (
@commands,
"txt:$tx1,$ty1:000000:bold 12pt Arial center:$width $UNIT:",
"txt:$tx2,$ty2:000000:bold 12pt Arial left:$width $UNIT:",
"rec:$x,$y,$px_width,$px_width,1:200,255,200,0.5:336633",
);
$name = $txts[3];
$peri = 4*$width;
$area = $width * $width;
}
if ($shape_selected eq "rectangle") {
if (!$vars{'rand_width'} || !$vars{'rand_height'}) {
$vars{'rand_width'} = 1+int(rand(14));
$vars{'rand_height'} = 1+int(rand(10));
}
my $width = $vars{'rand_width'};
my $height = $vars{'rand_height'};
if ($width == $height) {
$width = 10;
$height = 6;
}
if ($vars{'output_paper'}) {
$width = 1+int(rand($figure_max[0]));
$height = 1+int(rand($figure_max[1]));
while (($used{"rectangle_${width}_${height}"} || $width == $height) && $whilecounter < 256) {
$whilecounter++;
$width = 1+int(rand($figure_max[0]));
$height = 1+int(rand($figure_max[1]));
}
$width = $width-$vars{'rand_half_x'};
$height = $height-$vars{'rand_half_y'};
$used{"rectangle_${width}_${height}"}++;
my ($offset_x,$offset_y) = &offset("",$width,$height,$figure_max[0],$figure_max[1],$vars{'app_input_num_status'},$i);
my @draw = ($grid[0]+$offset_x,$grid[1]+$offset_y,$grid[0]+$offset_x+($width*10),$grid[1]+$offset_y+($height*10),1);
ONO::Lib::PDF::Draw->rect($canvas,$grid[0],$grid[1]-4,$grid[2],$grid[1]+2,1,"0:0:0:0","0:244:244:244",1);
ONO::Lib::PDF::Draw->font('H',10);
if ($vars{'variation'} eq "draw") {
if ($num_comma =~ /\,/) {
$width =~ s~\.~$num_comma~g;
$height =~ s~\.~$num_comma~g;
}
my ($T1,$T2) = (uc substr($txts[23],0,1),uc substr($txts[26],0,1));
ONO::Lib::PDF::Draw->text($canvas,$grid[0]+2,$grid[1],ucfirst "$txts[5] ($T1 = $width cm, $T2 = $height cm)");
} else {
ONO::Lib::PDF::Draw->text($canvas,$grid[0]+2,$grid[1],"?");
ONO::Lib::PDF::Draw->rect($canvas,@draw);
}
ONO::Lib::PDF::Draw->font('H',12);
my $peri = 2 * $width + 2 * $height;
my $area = $width * $height;
$corr_peri[$i] = "$txts[1]: 2 x $width + 2 x $height = $peri cm";
$corr_area[$i] = "$txts[2]: $width x $height = $area cm2";
$corr_cache[$i] = "$shape_selected:$draw[0]:$draw[1]:$draw[2]:$draw[3]:$draw[4]:";
}
$width = $width-$vars{'rand_half_x'};
$height = $height-$vars{'rand_half_y'};
my $px_width = $width * 32;
my $px_height = $height * 32;
my $x = (544 - $px_width ) / 2 - $vars{'rand_half_x'}*16;
my $y = (416 - $px_height ) / 2 - $vars{'rand_half_y'}*16;
my $tx1 = $x + ($px_width/2);
my $ty1 = $y - 8;
my $tx2 = $x + $px_width + 8;
my $ty2 = $y + ($px_height/2);
@commands = (
@commands,
"txt:$tx1,$ty1:000000:bold 12pt Arial center:$width $UNIT:",
"txt:$tx2,$ty2:000000:bold 12pt Arial left:$height $UNIT:",
"rec:$x,$y,$px_width,$px_height,1:200,255,200,0.5:336633",
);
$name = $txts[5];
$peri = (2*$width) + (2*$height);
$area = $width * $height;
}
if ($shape_selected eq "triangle") {
if (!$vars{'rand_width'} || !$vars{'rand_height'} || !$vars{'rand_top'}) {
$vars{'rand_width'} = 1+int(rand(14));
$vars{'rand_height'} = 1+int(rand(10));
$vars{'rand_top'} = 2 + int(rand(13));
}
my $width = $vars{'rand_width'};
my $height = $vars{'rand_height'};
my $top = $vars{'rand_top'};
if ($vars{'output_paper'}) {
$width = 1+int(rand($figure_max[0]));
$height = 1+int(rand($figure_max[1]));
$top = int(rand($width));
while ($used{"triangle_${width}_${height}_${top}"} && $whilecounter < 256) {
$whilecounter++;
$width = 1+int(rand($figure_max[0]));
$height = 1+int(rand($figure_max[1]));
$top = int(rand($width));
}
$width = $width-$vars{'rand_half_x'};
$height = $height-$vars{'rand_half_y'};
$used{"triangle_${width}_${height}_${top}"}++;
my ($offset_x,$offset_y) = &offset("",$width,$height,$figure_max[0],$figure_max[1],$vars{'app_input_num_status'},$i);
my @draw = ($grid[0]+$offset_x,$grid[1]+$offset_y+($height*10),$grid[0]+$offset_x+($width*10),$grid[0]+$offset_x+($top*10),$grid[1]+$offset_y,1);
ONO::Lib::PDF::Draw->rect($canvas,$grid[0],$grid[1]-4,$grid[2],$grid[1]+2,1,"0:0:0:0","0:244:244:244",1);
ONO::Lib::PDF::Draw->font('H',10);
if ($vars{'variation'} eq "draw") {
if ($num_comma =~ /\,/) {
$width =~ s~\.~$num_comma~g;
}
my ($T1,$T2) = (uc substr($txts[23],0,1),uc substr($txts[24],0,1));
ONO::Lib::PDF::Draw->text($canvas,$grid[0]+2,$grid[1],ucfirst "$txts[7] ($T1 = $width cm, $T2 = $width cm)");
} else {
ONO::Lib::PDF::Draw->text($canvas,$grid[0]+2,$grid[1],"?");
ONO::Lib::PDF::Draw->line($canvas,$draw[0],$draw[1],$draw[2],$draw[1],$draw[5]);
ONO::Lib::PDF::Draw->line($canvas,$draw[0],$draw[1],$draw[3],$draw[4],$draw[5]);
ONO::Lib::PDF::Draw->line($canvas,$draw[2],$draw[1],$draw[3],$draw[4],$draw[5]);
}
ONO::Lib::PDF::Draw->font('H',12);
my $s2 = int(10*sqrt($top*$top + $height*$height))/10;
my $s3 = int(10*sqrt(($width-$top)*($width-$top) + $height*$height))/10;
my $peri = $width + $s2 + $s3;
my $area = ($width * $height) / 2;
$corr_peri[$i] = "$txts[1]: $width + $s2 + $s3 = $peri cm";
$corr_area[$i] = "$txts[2]: $width x $height / 2 = $area cm2";
$corr_cache[$i] = "$shape_selected:$draw[0]:$draw[1]:$draw[2]:$draw[3]:$draw[4]:$draw[5]:";
}
$width = $width-$vars{'rand_half_x'};
$height = $height-$vars{'rand_half_y'};
my $px_top = $top * 32;
my $px_width = $width * 32;
my $px_height = $height * 32;
my $x = (544 - $px_width ) / 2 - $vars{'rand_half_x'}*16;
my $y = (416 - $px_height ) / 2 - $vars{'rand_half_y'}*16;
my $x1 = $x + $px_width;
my $y1 = $y + $px_height;
my $tx1 = $x + ($px_width/2);
my $ty1 = $y + $px_height + 24;
my $tx2 = $px_top + 10;
my $ty2 = $y + ($px_height / 2);
my $TXT2 = "txt:$tx2,$ty2:000000:bold 12pt Arial left:$height $UNIT:";
if ($px_top < 272) {
$tx2 = $tx2 - 20;
$TXT2 = "txt:$tx2,$ty2:000000:bold 12pt Arial right:$height $UNIT:";
}
@commands = (
@commands,
"txt:$tx1,$ty1:000000:bold 12pt Arial center:$width $UNIT:",
$TXT2,
"pol:$px_top,$y, $x,$y1, $x1,$y1, 1:200,255,200,0.5:336633",
"cir:$px_top,$y1,2,1:336633:336633",
"lin:$px_top,$y,$px_top,$y1,1:336633:336633",
);
$name = $txts[7];
my $base_right = $width - $top + (17-$width)/2;
my $base_left = $width - $base_right;
my $side_right = sqrt(($base_right*$base_right) + ($height*$height));
my $side_left = sqrt(($base_left*$base_left) + ($height*$height));
$peri = (int(100*($width + $side_left + $side_right)))/100;
$area = $width * $height / 2;
}
if ($shape_selected eq "circle") {
my $pi = 3.14;
if ($vars{'format_pi'} eq "31415") {
$pi = 3.1415;
}
if ($vars{'format_pi'} eq "3141592") {
$pi = 3.141592;
}
if ($vars{'output_paper'}) {
my $width = 1+int(rand($figure_max[0]));
if ($figure_max[1] < $figure_max[0]) {
$width = 1+int(rand($figure_max[1]));
}
while ($used{"circle_$width"} && $whilecounter < 256) {
$whilecounter++;
$width = 1+int(rand($figure_max[0]));
if ($figure_max[1] < $figure_max[0]) {
$width = 1+int(rand($figure_max[1]));
}
}
# half_x not required with circles, as we'll divide by 2 anyway...
$used{"circle_$width"}++;
my ($offset_x,$offset_y) = &offset("",$width,$width,$figure_max[0],$figure_max[1],$vars{'app_input_num_status'},$i);
my @draw = ($grid[0]+$offset_x+int($width*5),$grid[1]+$offset_y+($width*5),$width*5,1);
ONO::Lib::PDF::Draw->rect($canvas,$grid[0],$grid[1]-4,$grid[2],$grid[1]+2,1,"0:0:0:0","0:244:244:244",1);
ONO::Lib::PDF::Draw->font('H',10);
if ($vars{'variation'} eq "draw") {
my $width2 = $width/2;
if ($num_comma =~ /\,/) {
$width2 =~ s~\.~$num_comma~g;
}
my $T1 = uc substr($txts[25],0,1);
ONO::Lib::PDF::Draw->text($canvas,$grid[0]+2,$grid[1],ucfirst "$txts[9] ($T1 = $width2 cm)");
} else {
ONO::Lib::PDF::Draw->text($canvas,$grid[0]+2,$grid[1],"?");
ONO::Lib::PDF::Draw->circle($canvas,@draw);
}
ONO::Lib::PDF::Draw->font('H',12);
my $r = $width/2;
my $peri = int(10 * 2 * $pi * $r)/10;
my $area = int(10 * $pi * $r * $r)/10;
$corr_peri[$i] = "$txts[1]: 2 * $pi * $r = $peri cm";
$corr_area[$i] = "$txts[2]: $pi * $r * $r = $area cm2";
$corr_cache[$i] = "$shape_selected:$draw[0]:$draw[1]:$draw[2]:$draw[3]:";
}
my $PI = $pi;
$PI =~ s~\.~$num_comma~;
if (!$vars{'rand_radius'}) {
$vars{'rand_radius'} = 1+int(rand(6));
}
my $radius = $vars{'rand_radius'} - $vars{'rand_half_x'};
my $px_width = $radius * 32;
my $ty1 = 208 - ($px_width/2) + 10 - $vars{'rand_half_x'}*16;
my $lin = 208 - $px_width;
@commands = (
@commands,
"txt:425,32:000000:bold 12pt Arial:= $PI:",
"txt:280,$ty1:000000:bold 12pt Arial:$radius $UNIT:",
"lin:410,20,410,32,2:000000:000000",
"lin:415,20,415,32,2:000000:000000",
"lin:405,20,420,20,2:000000:000000",
"cir:272,208,$px_width,1:200,255,200,0.5:336633",
"cir:272,208,2,1:336633:336633",
"lin:272,$lin,272,208,1:336633:336633",
);
$name = $txts[9];
$peri = 2 * $pi * $radius;
$area = $pi * $radius * $radius;
}
my $HTML;
my ($PLA_NAME,$PLA_PERI,$PLA_AREA) = ('?','?','?');
if (ONO::IO->devstation) {
($PLA_NAME,$PLA_PERI,$PLA_AREA) = ($name,$peri,$area);
}
if ($i == 0 && $vars{'output_web'}) {
my ($NAME,$PERI,$AREA,$VARS,$focus);
my $CANVAS_ID = "geometry_canvas";
my $CANVAS = ONO::Lib::Image::Canvas->new($CANVAS_ID,544,416,"b");
$CANVAS .= ONO::Lib::Image::Canvas->script($CANVAS_ID,ONO::Lib::Image::Canvas->exec($CANVAS_ID,\@commands));
$CANVAS .= qq~<script>function_geometry_canvas();</script>~;
if (!$vars{'app_input_exercise_peri'} && !$vars{'app_input_exercise_area'}) {
$vars{'app_input_exercise_name'}++;
}
my $completed;
my %HINT;
if ($vars{'app_input_allow_hints'}) {
foreach my $h ('name','peri','area') {
my $ans = $name;
if ($h eq "peri") {
$ans = $peri;
}
if ($h eq "area") {
$ans = $area;
}
$HINT{$h} = qq~<td>
<a href="javascript:void(0);" onclick="hint('$h');" class="col3">
<div class="rel" style="right:5px">
<div class="block20 bg_dark radius20 rel" style="top:0px;left:0px">
<img class="block16 abs" src="/ono/osr/images/icons/crystal/16x16/apps/ktip.png" style="top:2px;left:2px" alt="">
</div>
<div id="output_web_hints_counter_$h" class="small mr5 abs" style="top:-6px;left:21px">$vars{"output_web_hints_$h"}</div>
</div>
</a>
<input type="hidden" id="output_web_hints_$h" name="output_web_hints_$h" value="$vars{"output_web_hints_$h"}">
<input type="hidden" id="output_web_correct_${h}" name="output_web_correct_${h}" value="$ans">
</td>
~;
}
$WEB .= ONO::FW::Apps::Core->hint_script_v2("length/2","(length/3*2)+1",$vars{'output_web_hints'});
}
if ($vars{'app_input_exercise_name'}) {
$completed--;
my $ANSWER = qq~<input type="text" id="output_web_answer_name_id" name="output_web_answer_name" value="$vars{'output_web_answer_name'}" class="w95" placeholder="$PLA_NAME">
<script>document.getElementById('output_web_answer_name_id').focus();</script>
~;
$focus++;
my $BG;
if ($vars{'output_web_answer_name'}) {
$vars{'output_web_mistakes'}++;
$BG = "bg_red";
}
if (uc $vars{'output_web_answer_name'} eq uc $name) {
$vars{'output_web_mistakes'}--;
$ANSWER = qq~<div class="bold green pad10_2">$name</div>
<input type="hidden" name="output_web_answer_name" value="$vars{'output_web_answer_name'}">
~;
$BG = "bg_green";
$completed++;
$focus--;
}
$NAME .= qq~<tr>
<td>$BLK{'name'}:</td>
</tr>
<tr class="$BG">
<td style="padding:2px 10px 2px 10px">$ANSWER</td>
$HINT{'name'}
</tr>
~;
}
if ($vars{'app_input_exercise_peri'} && ($shape_selected ne "triangle" || $vars{'app_input_exercise_peri_tri'})) {
$completed--;
my $ANSWER = qq~<input type="text" id="output_web_answer_peri_id" name="output_web_answer_peri" value="$vars{'output_web_answer_peri'}" class="w95" placeholder="$PLA_PERI">~;
if (!$focus) {
$ANSWER .= qq~<script>document.getElementById('output_web_answer_peri_id').focus();</script>~;
$focus++;
}
my $BG;
if ($vars{'output_web_answer_peri'}) {
$vars{'output_web_mistakes'}++;
$BG = "bg_red";
}
my $answer = $vars{'output_web_answer_peri'};
$answer =~ s~\,~\.~;
if ($answer > $peri-0.02 && $answer < $peri+0.02) {
$vars{'output_web_mistakes'}--;
$ANSWER = qq~<div class="bold green pad10_2">$vars{'output_web_answer_peri'}</div>
<input type="hidden" name="output_web_answer_peri" value="$vars{'output_web_answer_peri'}">
~;
$BG = "bg_green";
$completed++;
$focus--;
}
$PERI .= qq~<tr>
<td>$txts[1]:</td>
</tr>
<tr class="$BG">
<td style="padding:0px">
<table class="wide_table">
<tr>
<td class="w100" style="padding-left:10px">$ANSWER</td>
<td style="padding-right:10px">$UNIT</td>
$HINT{'peri'}
</tr>
</table>
</td>
</tr>
~;
}
if ($vars{'app_input_exercise_area'}) {
$completed--;
my $ANSWER = qq~<input type="text" id="output_web_answer_area_id" name="output_web_answer_area" value="$vars{'output_web_answer_area'}" class="w95" placeholder="$PLA_AREA">~;
if (!$focus) {
$ANSWER .= qq~<script>document.getElementById('output_web_answer_area_id').focus();</script>~;
$focus++;
}
my $BG;
if ($vars{'output_web_answer_area'}) {
$vars{'output_web_mistakes'}++;
$BG = "bg_red";
}
my $answer = $vars{'output_web_answer_area'};
$answer =~ s~\,~\.~;
if ($answer > $area-0.02 && $answer < $area+0.02) {
$vars{'output_web_mistakes'}--;
$ANSWER = qq~<div class="bold green pad10_2">$vars{'output_web_answer_area'}</div>
<input type="hidden" name="output_web_answer_area" value="$vars{'output_web_answer_area'}">
~;
$BG = "bg_green";
$completed++;
}
$AREA .= qq~<tr>
<td>$txts[2]:</td>
</tr>
<tr class="$BG">
<td style="padding:0px">
<table class="wide_table">
<tr>
<td class="w100" style="padding-left:10px">$ANSWER</td>
<td style="padding-right:10px">$UNIT<sup>2</sup></td>
$HINT{'area'}
</tr>
</table>
</td>
</tr>
~;
}
my $PROG = ONO::FW::Apps::Core->question_progress($vars{'app_input_number_of_questions'},$question_number);
if ($vars{'app_input_allow_hints'}) {
$stats_switches .= "H";
}
my $STATS = ONO::FW::Apps::Core->stats("",$BLK_ref,"acMWq$stats_switches");
my $BUTTON = qq~<input type="submit" name="output_web_check" value="$BLK{'check'}" class="button_green">~;
if ($completed == 0) {
$BUTTON = qq~<input type="submit" name="output_web_rescramble" value="$BLK{'continue'}..." class="button_green">
<div class="abs" style="width:1px;height:1px;overflow:hidden">
<input type="text" id="output_web_answer_id" name="output_web_continue_key" value="1" style="width:1px">
</div>
<script>document.getElementById('output_web_answer_id').focus();</script>
~;
} else {
foreach my $key ('shape','width','height','radius','top','half_x','half_y') {
if ($vars{"rand_$key"} ne "") {
$VARS .= qq~<input type="hidden" name="rand_$key" value="$vars{"rand_$key"}">~;
}
}
}
$WEB .= qq~<onload="function_$CANVAS_ID();">
<div class="box_black auto" style="width:880px;margin-top:5px">
<table class="default_table">
<tr class="vtop">
<td style="width:564px">
<div class="box_paper">
$CANVAS
</div>
</td>
<td style="width:296px;padding-left:10px">
<div class="box_paper mb10">
$VARS
<table class="wide_table mb10">
$NAME
$PERI
$AREA
<tr><td class="pad10_2"><div class="mt10">$BUTTON</div></td></tr>
</table>
</div>
<div class="box_paper">
<div class="inline w100 mb5">$PROG</div>
<div class="inline ml20 w100" style="height:75px">$STATS</div>
</div>
</td>
</tr>
</table>
</div>
~;
}
}
if ($vars{'output_web'}) {
$WEB .= ONO::FW::Apps::Core->input_vars(\%vars);
if ($vars{'app_input_number_of_questions'}-$question_number < 1) {
$WEB .= qq~<input type="hidden" name="output_web_completed" value="1">~;
}
$WEB .= qq~</form>~;
}
}
if (ONO::FW::Apps::Core->print_corrections("$BASE/pdf/pdf-$pdfkey-corr.pdf","",$format,$vars_ref)) {
ONO::FW::Apps::Core->headers(\%vars,$format,"c");
ONO::FW::Apps::PDF->title($BLK{'Corrections'},$PDF_OPTS,$vars{'app_input_print_options_code'},$format);
ONO::FW::Apps::Core->unique_copies_info($canvas,$copy,$vars_ref);
# ONO::Lib::PDF::ToolBox->canvas_test($canvas);
for (my $i = 0; $i < $vars{'app_input_num_status'}; $i++) {
my @grid = split(/:/,$corr_grid[$i]);
if ($vars{'app_input_precision_status'} < 5) {
ONO::Lib::PDF::Draw->grid($canvas,$grid[0],$grid[1],$grid[2],$grid[3],1,0.1,"","","","lL");
ONO::Lib::PDF::Draw->grid($canvas,$grid[0],$grid[1],$grid[2],$grid[3],5,0.1,"","","","l");
} else {
ONO::Lib::PDF::Draw->grid($canvas,$grid[0],$grid[1],$grid[2],$grid[3],5,0.1,"","","","L");
}
# ONO::Lib::PDF::Draw->grid($canvas,$grid[0],$grid[1],$grid[2],$grid[3],5);
my @cp = split(/:/,$corr_cache[$i]);
my $name = $txts[3];
if ($cp[0] eq "square") {
ONO::Lib::PDF::Draw->rect($canvas,$cp[1],$cp[2],$cp[3],$cp[4],$cp[5]);
}
if ($cp[0] eq "rectangle") {
ONO::Lib::PDF::Draw->rect($canvas,$cp[1],$cp[2],$cp[3],$cp[4],$cp[5]);
$name = $txts[5];
}
if ($cp[0] eq "triangle") {
ONO::Lib::PDF::Draw->line($canvas,$cp[1],$cp[2],$cp[3],$cp[2],$cp[6]);
ONO::Lib::PDF::Draw->line($canvas,$cp[1],$cp[2],$cp[4],$cp[5],$cp[6]);
ONO::Lib::PDF::Draw->line($canvas,$cp[3],$cp[2],$cp[4],$cp[5],$cp[6]);
$name = $txts[7];
}
if ($cp[0] eq "circle") {
ONO::Lib::PDF::Draw->circle($canvas,$cp[1],$cp[2],$cp[3],$cp[4],$cp[5]);
$name = $txts[9];
}
my $off_y;
foreach my $opt ('name','peri','area') {
if ($vars{"app_input_exercise_$opt"}) {
$off_y = $off_y + 5;
if ($opt eq "name") {
ONO::Lib::PDF::Draw->text($canvas,$grid[0]+6,$grid[1]+$off_y+4,"$BLK{'name'}: $name");
}
if ($opt eq "peri") {
ONO::Lib::PDF::Draw->text($canvas,$grid[0]+6,$grid[1]+$off_y+4,$corr_peri[$i],"","","n");
}
if ($opt eq "area") {
ONO::Lib::PDF::Draw->text($canvas,$grid[0]+6,$grid[1]+$off_y+4,$corr_area[$i],"","","n");
}
}
}
}
}
}
if ($vars{'output_web'}) {
$WEB = ONO::FW::Apps::Core->stats_replace(
$WEB,
$question_number-1,
$stat_wrong,
$vars{'app_input_number_of_questions'}-$question_number+1,
$vars{'output_web_mistakes'},
$page,
$pages,
$vars{'output_web_completed'},
$vars{'output_web_hints'},
);
}
if ($vars{'output_paper'}) {
ONO::FW::Apps::PDF->end;
$WEB .= ONO::FW::Apps::Core->output_paper($pdfkey,\%BLK,\%vars,$HTTP,$BASE,"S");
}
}
if ($vars{'output_web'}) {
ONO::FW::Apps::Core->varstore($vars{'username'},$vars{'virclass'},$vars{'anonymous'},\%vars);
}
} else {
#############################################################
# EXERCISE SETUP
#############################################################
my ($CUSTOM,@sel,%sel2,$hide_pi);
my @shapes = (
"line:$BLK{'line'}",
"square:$txts[3]",
"rectangle:$txts[5]",
"triangle:$txts[7]",
"circle:$txts[9]",
);
if (!"$vars{'app_input_shape_use_square'}$vars{'app_input_shape_use_rectangle'}$vars{'app_input_shape_use_circle'}$vars{'app_input_shape_use_triangle'}") {
$sel2{"shape_square"} = "_dark";
$sel2{"shape_rectangle"} = "_dark";
$sel2{"shape_use_square"} = 1;
$sel2{"shape_use_rectangle"} = 1;
}
if (!$vars{'app_input_shape_use_circle'}) {
$hide_pi = "hide";
}
foreach my $shape (@shapes) {
my @sp = split(/:/,$shape);
if ($vars{"app_input_shape_use_$sp[0]"}) {
$sel2{"shape_$sp[0]"} = "_dark";
$sel2{"shape_use_$sp[0]"} = 1;
}
$CUSTOM .= qq~<div class="fl rel" onmouseover="onojs_block('shape_info_$sp[0]')" onmouseout="onojs_hide('shape_info_$sp[0]')">
<a id="shape_button_$sp[0]" href="javascript:void(0);" onclick="shape_toggle('$sp[0]');" class="button$sel2{"shape_$sp[0]"}" style="height:18px">
<img class="block32" src="/ono/osr/images/geometry/shapes/64/$sp[0].png" alt="">
</a>
<a href="javascript:void(0);" onclick="shape_toggle('$sp[0]');">
<div id="shape_info_$sp[0]" class="box_paper pad10_2 radius5 abs hide" style="top:24px;left:5px;z-index:99">$sp[1]</div>
</div>
<input type="hidden" id="shape_use_$sp[0]_id" name="app_input_shape_use_$sp[0]" value="$sel2{"shape_use_$sp[0]"}">
</div>
~;
}
my $SCRIPT .= qq~<script>
function shape_toggle(shape) {
if (onojs_getvalue('shape_use_'+shape+'_id') == 1) {
onojs_setvalue('shape_use_'+shape+'_id','0');
onojs_class('shape_button_'+shape,'button');
if (shape == 'circle') {onojs_hide('select_pi')}
} else {
onojs_setvalue('shape_use_'+shape+'_id','1');
onojs_class('shape_button_'+shape,'button_green');
if (shape == 'circle') {onojs_block('select_pi')}
}
}
</script>
~;
if (!"$vars{'app_input_exercise_peri'}$vars{'app_input_exercise_area'}$vars{'app_input_exercise_name'}") {
$sel[0]++;
$sel[2]++;
}
if ($vars{'app_input_exercise_peri'}) {
$sel[0]++;
if ($vars{'app_input_exercise_peri_tri'}) {
$sel[1]++;
}
}
if ($vars{'app_input_exercise_area'}) {
$sel[2]++;
}
if ($vars{'app_input_exercise_name'}) {
$sel[3]++;
}
my @exercises = (
"name:$sel[3]:$BLK{'name'}",
"peri:$sel[0]:$txts[1]",
"peri_tri:$sel[1]:$txts[11]:gims",
"area:$sel[2]:$txts[2]",
);
if (!$vars{'app_input_pi_status'}) {
$vars{'app_input_pi_status'} = "31415";
}
my %setup;
my @tabs = ("314:dark:3.14","31415:dark:3.1415","3141592:dark:3.141592");
my $PI = qq~<div id="select_pi" class="$hide_pi"><table class="default_table"><tr><td>π</td><td>=</td><td></td><td class="p0">~;
$PI .= ONO::Lib::UI::Select->buttons(
"app_input_pi",
$vars{'app_input_pi_status'},
\@tabs,
"",
"f",
$BLK_ref,
\%setup,
);
$PI .= qq~</td></tr></table></div>~;
my @tabs2 = ("10:dark:cm (1)","05:dark:$txts[27]","01:dark:mm (0.1)");
my $PRE = ONO::Lib::UI::Select->buttons(
"app_input_precision",
$vars{'app_input_precision_status'},
\@tabs2,
"",
"f",
$BLK_ref,
\%setup,
);
if (!$vars{'app_input_number_of_questions'}) {
$vars{'app_input_number_of_questions'} = 20;
}
my $CONF;
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"",$txts[0],$CUSTOM);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"","",$PI);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
if (!$vars{'output_web'} && !$vars{'output_paper'}) {
my $HELP = qq~<a href="javascript:void(0);" onclick="onojs_block('help_box');" class="button_yellow button_mini">$BLK{'help'} / $txts[12]</a>~;
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"","",$HELP);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
}
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"",$BLK{'unit'},$PRE);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("checks", $BLK_ref,\%vars,"",$BLK{'exercise'},"exercise",@exercises);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
if ($vars{'output_paper'}) {
if (!"$vars{'app_input_mode_measure'}$vars{'app_input_mode_draw'}") {
$sel[10] = 1;
$sel[11] = 1;
}
my @modes = (
"measure:$sel[10]:$txts[20]",
"draw:$sel[11]:$txts[21]",
);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("checks", $BLK_ref,\%vars,"",$BLK{'type'},"mode",@modes);
if ($vars{'app_input_num_status'} < 1) {
$vars{'app_input_num_status'} = 4;
}
my @tabs = ("1:green:1","2:green:2","3:green:3","4:green:4");
my $NUM = qq~<table class="default_table"><tr><td class="p0">~;
$NUM .= ONO::Lib::UI::Select->buttons(
"app_input_num",
$vars{'app_input_num_status'},
\@tabs,
"",
"f",
$BLK_ref,
\%setup,
);
$NUM .= qq~</td><td></td><td class="small">$txts[15]</td></tr></table>~;
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"","",$NUM);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
}
$WEB .= ONO::FW::Apps::Core->conf_box(
$db,
$community,
$app,
$form,
"",
$action_url,
$CONF,
$lang,
$BLK_ref,
\%vars,
"op-ncd-CD-lsu-N-H",
);
$WEB .= $SCRIPT;
$WEB .= ONO::FW::Apps::Core->infopics(
"screen:320:50:50::geometry_screenshot_1.jpg",
"sheet:168:180:110:15:geometry_sheet_1.jpg",
);
if (!$vars{'exercise'}) {
$WEB .= ONO::FW::Apps::Core->info_display(
ONO::FW::Apps::Core->info("info_online_print",$vars{'app_lang'}),
ONO::FW::Apps::Core->info("info_indiv_diff", $vars{'app_lang'}),
);
}
my $S = "S";
my $W = "W";
my $H = "H";
my $R = "R";
if ($vars{'app_lang'} =~ /^(de|lu)$/) {
$W = "L";
$H = "B";
}
$WEB .= qq~<div id="help_box" class="box_black abs w90 hide" style="margin:20px 0px 0px 20px;z-index:99">
<a href="javascript:void(0);" onclick="onojs_hide('help_box');">
<img class="close" src="/ono/osr/images/icons/crystal/32x32/ono/close.png" alt="close button" alt="">
</a>
<h2>$txts[12]</h2>
<div class="box_paper">
<table class="wide_table mb10">
<tr class="bb">
<td class="w20"></td>
<td class="w20 p10 bl center"><h3>$txts[3]</h3></td>
<td class="w20 p10 bl center"><h3>$txts[5]</h3></td>
<td class="w20 p10 bl center"><h3>$txts[7]</h3></td>
<td class="w20 p10 bl center"><h3>$txts[9]</h3></td>
</tr>
<tr class="bb">
<td class="p10">$txts[1]</td>
<td class="p10 bl center">$S + $S + $S + $S<div class="p5 col9">$BLK{'or'}</div>4 • $S</td>
<td class="p10 bl center">$W + $H + $W + $H<div class="p5 col9">$BLK{'or'}</div>2 • $W + 2 • $H</td>
<td class="p10 bl center">$S<sub>1</sub> + $S<sub>2</sub>* + $S<sub>3</sub>*</td>
<td class="p10 bl center">2 • π • $R</td>
</tr>
<tr>
<td class="p10">$txts[2]</td>
<td class="p10 bl center">$S • $S<div class="p5 col9">$BLK{'or'}</div>$S<sup>2</sup></td>
<td class="p10 bl center">$W • $H</td>
<td class="p10 bl center">($W • $H) / 2</td>
<td class="p10 bl center">π • $R<sup>2</sup></td>
</tr>
</table>
<div class="inline auto"><a href="javascript:void(0);" onclick="onojs_hide('help_box');" class="button_green">$BLK{'done'}</a></div>
<div class="mt20 italic small col9">
*) $txts[13] (a<sup>2</sup> + b<sup>2</sup> = c<sup>2</sup>).
</div>
</div>
</div>
~;
}
my ($status,$WEB) = ONO::Lib::Parser->parse($WEB,$vars_ref);
$WEB .= ONO::FW::Apps::Core->vardump(\%vars);
$WEB = ONO::FW::Edu::Apps::ToolBox->apps_gate($WEB,$vars_ref);
return $WEB;
}
###################################################################
# SUBS
###################################################################
sub offset {
my (
$self,
$width,
$height,
$max_x,
$max_y,
$number,
$i,
) = @_;
return (10*int(($max_x-$width)/2)+5,10*int(($max_y-$height)/2)+5);
}
###################################################################
#### THAT'S IT :-D
###################################################################
1;
__END__