HP Prime for All

English  Русский 

Author: Edward Shore (original article)

Drawing Iconic Pictures with the HP Prime

4x4 Pixels: DRAWICON4(number)

Entry: Real number, integer

The number is ultimately converted into a binary number, with each of the 16 bits fitting a 4x4 matrix.

If the square is turned "on" (having a value of 1), a square will be drawn.

Each space if the matrix represents a binary bit: 2^0, 2^1, 2^2, 2^3, etc.

The lowest value bit is located at the bottom, right-hand corner element of the matrix.

You can specify whether the squares will be drawn in black or a specific color.

The 4x4 matrix of bits is represented as this:

[ [ 2^15, 2^14, 2^13, 2^12 ],
[ 2^11, 2^10, 2^9, 2^8 ],
[ 2^7, 2^6, 2^5, 2^4 ],
[ 2^3, 2^2, 2^1, 2^0 ] ]

Program:

Comments followed by // are for notes and do not necessarily have to be typed.

EXPORT DRAWICON4(m)
BEGIN // EWS 12/28/2013

// does the user want color?
LOCAL ch, R, G, B;
CHOOSE(ch, "Color?", "Black", "Yes");
IF ch == 1 THEN ch := RGB(0, 0, 0);
ELSE
INPUT({R, G, B}, "Color Input",
{"Red", "Green", "Blue"}, { }, {0, 0, 0});
ch := RGB(R, G, B);
END;

// convert m to real to be broken down
// Type 1 is an integer (#)
IF TYPE(m) == 1 THEN m := B→R(m);
END;

// remove negation and fraction parts (so entries like -12 and 34.55 are acceptable)
m := ABS(IP(m));

// allow m to be text by storing it in M
LOCAL M := m;

// check for upper limit
IF m > 65535 THEN MSGBOX("Excess of 65535!");
KILL;
END;

// break m into its binary parts and puts them in the required order
LOCAL n := 15, r, c,
mat := MAKELIST(0, X, 1, 16);

REPEAT IF 2^n ≤ m THEN m := m-2^n;
mat(n+1) := 1;
END;
n := n-1;
UNTIL n < 0;
mat := REVERSE(mat);

// list2mat(list, number of columns) - found in the catalog
mat := list2mat(mat, 4);

// drawing a border and label
RECT();
RECT_P(129, 79, 189, 139, RGB(0, 0, 255),
RGB(255, 255, 255));
TEXTOUT_P(M, 139, 0, 4, RGB(0, 128, 0));

// use the matrix to draw the squares
// pixels x = columns, y = rows
FOR r FROM 1 TO 4 DO FOR c FROM 1 TO 4 DO 
IF mat(r, c) == 1 THEN RECT_P(129+15 * (c-1), 79+15 * (r-1),
129+15*c, 79+15*r, ch);
END;
END;
END;

WAIT(0);

END;

Screen Left Screen Right Screen Left Screen Right


Here is a 6x6 version: DRAWICON6

6x6 Pixels: DRAWICON6(number)

Entry: Real number, integer

The program is an almost carbon-copy of DRAWICON4, except the limits have changed.

Program:

Comments followed by // are for notes and do not necessarily have to be typed.

EXPORT DRAWICON6(m)
BEGIN // EWS 12/28/2013

// does the user want color?
LOCAL ch, R, G, B;
CHOOSE(ch, "Color?", "Black", "Yes");
IF ch == 1 THEN ch := RGB(0, 0, 0);
ELSE
INPUT({R, G, B}, "Color Input",
{"Red", "Green", "Blue"}, { }, {0, 0, 0});
ch := RGB(R, G, B);
END;

// convert m to real to be broken down
// Type 1 is an integer (#)
IF TYPE(m) == 1 THEN m := B→R(m);
END;

// remove negation and fraction parts (so entries like -12 and 34.55 are acceptable)
m := ABS(IP(m));

// allow m to be text by storing it in M
LOCAL M := m;

// check for upper limit
IF m > 2^36-1 THEN MSGBOX("Excess!");
KILL;
END;

// break m into its binary parts and puts them in the required order
LOCAL n := 35, r, c,
mat := MAKELIST(0, X, 1, 36);

REPEAT IF 2^n ≤ m THEN m := m-2^n;
mat(n+1) := 1;
END;
n := n-1;
UNTIL n < 0;
mat := REVERSE(mat);

// list2mat(list, number of columns) - found in the catalog
mat := list2mat(mat, 6);

// drawing a border and label
RECT();
RECT_P(129, 79, 219, 169, RGB(0, 0, 255),
RGB(255, 255, 255));
TEXTOUT_P(M, 139, 0, 4, RGB(0, 128, 0));

// use the matrix to draw the squares
// pixels x = columns, y = rows
FOR r FROM 1 TO 6 DO FOR c FROM 1 TO 6 DO 
IF mat(r, c) == 1 THEN RECT_P(129+15 * (c-1), 79+15 * (r-1),
129+15*c, 79+15*r, ch);
END;
END;
END;

WAIT(0);

END;

Screen Left Screen Right Screen Right


Have fun and thank you as always!

I wonder how much of a challenge to do this on a TI-84?

See you next time!

Eddie

Comments