19928/jj_vitp/Interface/widgets/other_widgets/flag.e

642 lines
22 KiB
Plaintext
Raw Permalink Normal View History

2024-06-17 07:09:33 +00:00
note
description: "[
A base class for building the Japanese or US flag
]"
author: "Jimmy J. Johnson"
class
FLAG
inherit
FONT_AND_COLOR_CONSTANTS
undefine
default_create
end
DIMABLE
redefine
default_create
end
EV_MODEL_WORLD
redefine
default_create,
create_interface_objects
end
create
make
create {FLAG}
list_make
feature {NONE} -- Initialization
default_create
-- Set up Current
do
Precursor {DIMABLE}
Precursor {EV_MODEL_WORLD}
build_widgets
end
make (a_location: like location)
-- Set up Current
do
location_imp := a_location
default_create
end
create_interface_objects
-- Create attributes
do
Precursor {EV_MODEL_WORLD}
create field
create border.make (width, height, border_size)
background_coordinates := [create {EV_COORDINATE}, create {EV_COORDINATE}]
create background
create charge
create rising_sun
create canton
create canton_imp
create stars.make
end
build_widgets
-- Create the widget and associate it with `a_location'
do
build_field
build_us_charge
build_japanese_charge
build_canton
build_border
scale (0.07)
end
build_border
-- Add the border on top of other widgets in Current
do
extend (border)
end
build_field
-- Create the flags background
local
p1, p2: EV_COORDINATE
do
create field
extend (field)
-- create p1.make_precise (0.0, 0.0)
-- create p2.make_precise (width, height)
create p1.make_precise (border_size, border_size)
create p2.make_precise (width - border_size, height - border_size)
create background.make_with_points (p1, p2)
-- Save the points
background_coordinates := [p1, p2]
field.extend (background)
end
build_us_charge
-- Build the `charge', sizing it relative to the `background' rectangle.
-- Create the red stripes. (The white is background.)
local
i: INTEGER
x1, y1, x2, y2: REAL_64
h: REAL_64
stripe: EV_MODEL_POLYGON
do
create charge
field.extend (charge)
x1 := background_coordinates.point_1.x + 2
y1 := background_coordinates.point_1.y + 2
x2 := background_coordinates.point_2.x - 2
y2 := background_coordinates.point_2.y - 2
h := (y2 - y1) / 13
from i := 1
until i > 13
loop
if i \\ 2 = 1 then
create stripe
stripe.extend_point (create {EV_COORDINATE}.make_precise (x1, y1 + (i - 1) * h))
stripe.extend_point (create {EV_COORDINATE}.make_precise (x2, y1 + (i - 1) * h))
stripe.extend_point (create {EV_COORDINATE}.make_precise (x2, y1 + i * h))
stripe.extend_point (create {EV_COORDINATE}.make_precise (x1, y1 + i * h))
charge.extend (stripe)
end
i := i + 1
end
end
build_japanese_charge
-- Create the sun and rays for the Japanese flag
local
p1: EV_MODEL_POLYGON
os: REAL_64
clipper: POLYGON_CLIPPER
ang, ang_step: REAL_64
mid: EV_COORDINATE
ray: EV_MODEL_POLYGON
do
build_rising_sun
rising_sun.scale_x (1.8)
rising_sun.scale_y (1.4)
field.extend (rising_sun)
-- Must move the charge a bit to line up with the background
rising_sun.set_x_y (165, 100)
-- center_widget_on_other (rising_sun, field)
-- create japanese_charge
-- field.extend (japanese_charge)
-- -- Build the `japanese_charge' inside a square so the angles at which the rays
-- -- radiate from the sun can be uniformly spaced around a circle. After
-- -- the rays are build the `charge' is scaled to match the flag's `width'
-- -- and `height'.
-- -- Create a polygon slightly smaller than the `field'
-- os := width / 10.0
-- create p1
-- p1.extend_point (create {EV_COORDINATE}.make_precise (os, os))
-- p1.extend_point (create {EV_COORDINATE}.make_precise (width - os, os))
-- p1.extend_point (create {EV_COORDINATE}.make_precise (width - os, width - os))
-- p1.extend_point (create {EV_COORDINATE}.make_precise (os, width - os))
-- -- Each of the 16 "rays" immenating from the sun is built as a triangle centered
-- -- at the midpoint, extending beyond the boundaries of `p1'. Each ray is then
-- -- clipped against `p1'
-- create clipper
-- ang := (2.0 * Pi) / 16.0
-- create mid.make_precise (width / 2.0, width / 2.0)
-- from i := 1
-- until i > 16
-- loop
-- create ray.default_create
-- ray.extend_point (mid)
-- ax := delta_x (ang * i, width)
-- ay := delta_y (ang * i, width)
-- ray.extend_point (create {EV_COORDINATE}.make_precise (ax, ay))
-- ax := delta_x (ang * (i + 1), width)
-- ay := delta_y (ang * (i + 1), width)
-- ray.extend_point (create {EV_COORDINATE}.make_precise (ax, ay))
-- ray := clipper.clipped (ray, p1)
-- field.extend (ray)
-- i := i + 1
-- end
end
-- build_canton
-- -- Create the union on US flag.
-- -- This contains the [50] stars (should be 48).
-- local
-- p1, p2: EV_COORDINATE
-- s: STAR
-- i, j: INTEGER
-- a, b: REAL_64
-- c, d: REAL_64
-- e, f, g, h: REAL_64
-- k: REAL_64
-- ax, ay: REAL_64
-- t: EV_MODEL_TRANSFORMATION
-- do
-- create t.make_zero
-- create canton
-- field.extend (canton)
-- a := height
-- b := width
-- c := a * 7/13
-- d := b * 2/5
-- e := c / 10
-- f := c / 10
-- g := d / 12
-- h := d / 12
-- k := a * 0.0616
-- create p1.make_precise (0.0, 0.0)
-- create p2.make_precise (d, c)
---- create canton_imp.make_with_points (p1, p2)
---- create canton_imp
-- canton_imp.extend_point (create {EV_COORDINATE}.make_precise (0.0, 0.0))
-- canton_imp.extend_point (create {EV_COORDINATE}.make_precise (d, 0.0))
-- canton_imp.extend_point (create {EV_COORDINATE}.make_precise (d, c))
-- canton_imp.extend_point (create {EV_COORDINATE}.make_precise (0.0, c))
-- canton.extend (canton_imp)
-- -- A star is created, scaled and then its center point is moved to
-- -- (0, 0). From there the star is positioned based on the algorithm.
-- -- Add the 6 x 5 set of stars
-- from i := 1
-- until i > 6
-- loop
-- ax := (i - 1) * (2 * h) + g
-- from j := 1
-- until j > 5
-- loop
-- create s
---- s.set_target (location)
-- s.scale (0.0616)
-- canton.extend (s)
-- stars.extend (s)
-- t.translate (-s.dot.point.x, -s.dot.point.y)
-- s.transform (t)
-- ay := (j - 1) * (2 * f) + e
-- t.translate (ax, ay)
-- s.transform (t)
-- j := j + 1
-- end
-- i := i + 1
-- end
-- -- Add the remaining stars, the 5 x 4 set
-- from i := 1
-- until i > 5
-- loop
-- ax := i * (2 * h) - h + g
-- from j := 1
-- until j > 4
-- loop
-- create s
---- s.set_target (location)
-- s.scale (0.0616)
-- canton.extend (s)
-- t.translate (-s.dot.point.x, -s.dot.point.y)
-- s.transform (t)
-- ay := j * (2 * f) - f + e
-- t.translate (ax, ay)
-- s.transform (t)
-- j := j + 1
-- end
-- i := i + 1
-- end
-- end
build_canton
-- Create the 48-star union on US flag.
-- The dimensions were estimated based on the 50-star version.
local
-- p1, p2: EV_COORDINATE
s: STAR
i, j: INTEGER
a, b: REAL_64
c, d: REAL_64
e, f, g, h: REAL_64
k: REAL_64
ax, ay: REAL_64
marg: REAL_64 -- margin to account for boarder
t: EV_MODEL_TRANSFORMATION
x1, y1, x2, y2: REAL_64
do
create t.make_zero
create canton
field.extend (canton)
x1 := background_coordinates.point_1.x + 2
y1 := background_coordinates.point_1.y + 2
x2 := background_coordinates.point_2.x - 2
y2 := background_coordinates.point_2.y - 2
-- a := height - 2 * border_size
-- b := width - 2 * border_size
a := y2 - y1
b := x2 - x1
c := a * 7/13
d := b * 2/5
e := c / 7 -- divided by number of rows + 1
f := c / 7 -- divided by number of rows + 1
g := d / 9 -- divided by number of columns + 1
h := d / 9 -- divided by number of columns + 1
k := a * 0.0616
-- create p1.make_precise (0.0, 0.0)
-- create p2.make_precise (d, c)
-- Create the blue background for the stars
canton_imp.extend_point (create {EV_COORDINATE}.make_precise (x1, y1))
canton_imp.extend_point (create {EV_COORDINATE}.make_precise (x1 + d, y1))
canton_imp.extend_point (create {EV_COORDINATE}.make_precise (x1 + d, y1 + c))
canton_imp.extend_point (create {EV_COORDINATE}.make_precise (x1, y1 + c))
canton.extend (canton_imp)
-- A star is created, scaled and then its center point is moved to
-- (0, 0). From there the star is positioned based on the algorithm.
-- Add the 6 x 5 set of stars
from i := 1
until i > 8
loop
-- ax := (i - 1) * (2 * h) + g
-- ax := (i - 1) * h + g/2
ax := x1 + (i - 1) * h + g
from j := 1
until j > 6
loop
create s
s.scale (0.0616)
canton.extend (s)
stars.extend (s)
-- t.translate (-s.dot.point.x, -s.dot.point.y)
-- s.transform (t)
s.set_x_y (0, 0)
-- ay := (j - 1) * (2 * f) + e
-- ay := (j - 1) * f + e/2
ay := y1 + (j - 1) * f + e
t.translate (ax, ay)
s.transform (t)
j := j + 1
end
i := i + 1
end
end
feature -- Access
location: LOCATION
-- The location (e.g. a PORT or a chart) to which
-- this marker belongs
require
has_location: has_location
do
check attached location_imp as loc then
Result := loc
end
end
set_location (a_location: like location)
-- Change the `location'
do
location_imp := a_location
end
feature {NONE} -- Implementation
location_imp: detachable like location
-- Implementation for `location'
feature -- Status report
has_location: BOOLEAN
-- Has a location been assigned?
do
Result := attached location_imp
end
is_outlined: BOOLEAN
-- Should the outline of the flag show?
-- If yes, change the foreground color to show a line around Current.
is_flat: BOOLEAN
-- Should Current be drawn as a flat picture?
feature -- Status setting
show_outline
-- Make the outline of the flag visible
do
is_outlined := true
end
hide_outline
-- Make the outline of the flag NOT visible
do
is_outlined := false
end
set_flat
-- Cause the widget to be painted as a flat tile
do
is_flat := True
paint
end
set_raised
-- Cause the widget to be painted as a 3-d tile
do
is_flat := False
paint
end
feature -- Basic operations
-- set_dimming_level (a_level: INTEGER)
-- -- Change the `dimming_level'
-- do
-- Precursor {DIMABLE} (a_level)
-- paint
-- end
paint
-- Set the colors of the sub-widgets
do
paint_field
paint_charge
paint_canton
paint_border
if is_flat then
border.hide
else
border.show
end
if location.is_allied then
field.show
charge.show
canton.show
rising_sun.hide
elseif location.nationality = {NATIONALITY_CONSTANTS}.japanese then
field.show
rising_sun.show
charge.hide
canton.hide
else
field.hide
charge.hide
canton.hide
rising_sun.hide
border.hide
end
end
feature {NONE} -- Implementation
paint_border
-- Set the color for the `border'
do
border.set_color (adjusted_color (White))
end
paint_field
-- Paint the `field'
local
c: EV_COLOR
do
c := us_flag_white_color
background.set_background_color (adjusted_color (c))
-- Set color for boarder around the background if shown.
-- This is just the line around the flag on the OA Charts.
if is_outlined then
if location.nationality = {NATIONALITY_CONSTANTS}.japanese then
c := japanese_unit_color
else
c := us_unit_color
end
end
background.set_foreground_color (adjusted_color (c))
end
paint_charge
-- Paint the `charge'
do
from charge.start
until charge.exhausted
loop
if attached {EV_MODEL_POLYGON} charge.item as s then
s.set_foreground_color (adjusted_color (US_flag_red_color))
s.set_background_color (adjusted_color (US_flag_red_color))
end
rising_sun.set_foreground_color (adjusted_color (Japanese_unit_color))
rising_sun.set_background_color (adjusted_color (Japanese_unit_color))
charge.forth
end
end
paint_canton
-- Paint the canton area (and stars)
local
s: STAR
do
canton_imp.set_background_color (adjusted_color (US_flag_blue_color))
canton_imp.set_foreground_color (adjusted_color (US_flag_blue_color))
-- Must paint each star (to dim or brighten them)
from stars.start
until stars.off
loop
s := stars.item
s.set_background_color (adjusted_color (white))
s.set_foreground_color (adjusted_color (white))
stars.forth
end
end
feature {NONE} -- Implementation
frozen height: REAL_64 = 200.0
-- The span of a flag down the side parallel to the flagpole
-- width: REAL_64 = 380.0
width: REAL_64 = 330.0
-- The span of the flag along the side at right angles to the flagpole
ratio: REAL_64
-- The ratio of the `width' / `height' (1.9 for US flags)
background_coordinates: TUPLE [point_1: EV_COORDINATE; point_2: EV_COORDINATE]
-- The corner points for the `background'.
-- Used EV_COORDINATE to be more precise (i.e. REAL_64, not INTEGER_32)
background: EV_MODEL_RECTANGLE
-- The background of Current (usually white)
border: BORDER
-- The borders around the `field', giving a raised appearance
border_size: REAL_64
-- Ratio of the size of the `border' to `width'
do
Result:= (height.min (width)) / 20
end
canton: EV_MODEL_WORLD
-- The upper hoist (left) quarter (contains the field of stars in US flag)
charge: EV_MODEL_WORLD
-- A figure or symbol appearing on the flag
rising_sun: EV_MODEL_POLYGON
-- The red sun and rays on the Japanese flag
field: EV_MODEL_WORLD
-- The top container for Current
canton_imp: EV_MODEL_POLYGON
-- The rectangle to make a blue canton
stars: LINKED_SET [STAR]
-- Keep track of all the stars in Current, so they can be dimmed
-- when `set_dimming_level' is called
build_rising_sun
-- Make the polygon
do
create rising_sun
-- Points generated by Grabber application
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (0, 0))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (32.395061728395063, 39.308641975308639))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (35.358024691358025, 37.728395061728392))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (38.913580246913575, 35.55555555555555))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (20.938271604938265, 1.7777777777777786))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (33.777777777777771, 1.7777777777777786))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (43.851851851851848, 33.777777777777764))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (46.617283950617285, 33.58024691358024))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (49.97530864197531, 32.79012345679012))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (47.407407407407412, 1.5802469135802468))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (58.66666666666665, 1.9753086419753103))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (56.888888888888879, 33.185185185185176))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (59.851851851851841, 32.987654320987652))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (64.395061728395063, 33.975308641975303))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (74.074074074074048, 1.3827160493827169))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (87.111111111111114, 1.7777777777777786))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (69.925925925925895, 35.950617283950614))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (72.296296296296276, 37.92592592592591))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (74.271604938271594, 40.296296296296291))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (107.25925925925924, 0.98765432098765338))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (130.17283950617283, 1.1851851851851851))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (78.81481481481481, 44.444444444444436))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (80.790123456790099, 47.012345679012341))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (82.370370370370352, 50.962962962962955))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (168.09876543209876, 1.3827160493827169))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (167.90123456790118, 30.024691358024683))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (85.333333333333314, 55.506172839506164))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (85.925925925925895, 58.074074074074055))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (85.925925925925895, 62.222222222222207))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (167.90123456790118, 54.716049382716044))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (168.09876543209876, 76.246913580246883))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (85.925925925925895, 68.938271604938251))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (85.53086419753086, 72.098765432098759))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (85.135802469135797, 75.851851851851848))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (167.3086419753086, 100.34567901234567))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (166.71604938271602, 130.56790123456787))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (83.160493827160479, 80.592592592592581))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (81.382716049382708, 83.160493827160479))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (79.407407407407391, 85.728395061728378))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (130.56790123456787, 128.59259259259255))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (107.06172839506172, 129.38271604938268))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (75.259259259259238, 89.679012345679013))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (72.691358024691368, 92.049382716049365))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (69.53086419753086, 94.024691358024654))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (87.308641975308632, 128.98765432098762))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (74.074074074074048, 129.18518518518516))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (64.592592592592581, 96.395061728395035))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (61.432098765432094, 97.185185185185162))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (57.283950617283942, 97.185185185185162))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (60.049382716049372, 128.79012345679007))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (47.999999999999993, 128.79012345679007))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (50.37037037037036, 97.382716049382708))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (47.407407407407412, 97.185185185185162))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (44.049382716049372, 95.999999999999972))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (34.172839506172842, 128.98765432098762))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (19.950617283950621, 129.18518518518516))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (38.716049382716044, 94.024691358024654))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (35.358024691358025, 92.839506172839464))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (32.592592592592588, 90.469135802469111))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (0.39506172839506704, 128.59259259259255))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (0.39506172839506704, 109.43209876543207))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (28.839506172839513, 85.925925925925895))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (26.074074074074076, 83.358024691357997))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (24.493827160493822, 79.999999999999972))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (0.19753086419753174, 93.03703703703701))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (0.19753086419753174, 82.172839506172807))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (21.728395061728399, 75.061728395061692))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (21.728395061728399, 71.703703703703695))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (21.925925925925924, 68.34567901234567))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (0.39506172839506704, 70.123456790123441))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (0.39506172839506704, 61.234567901234563))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (21.728395061728399, 62.617283950617271))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (21.333333333333336, 59.061728395061728))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (22.320987654320987, 56.493827160493829))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (0.19753086419753174, 49.185185185185176))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (0.39506172839506704, 37.530864197530853))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (24.691358024691361, 50.567901234567891))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (26.271604938271594, 47.012345679012341))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (28.444444444444436, 44.049382716049379))
rising_sun.extend_point (create {EV_COORDINATE}.make_precise (0, 20.938271604938272))
end
end