Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE HTML ><html lang="en"><head><title>
- REC_MAP
- </title></head><body></body><script> //://///////////////////://
- //://////////////////////////////////////////////////////////://
- function GetRectanglePackage( ){
- //[ [0]: The target rectangle/viewport. ]//
- //[ [01]: Smaller rectangle to map onto [0]. ]//
- //[ [02]: Smaller rectangle to map onto [0]. ]//
- //[ [3]: Larger rectangle to map onto [0]. ]//
- //[ SEE: DoMapping function for rectangle mapping logic. ]//
- //|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|//
- //| 0 8 16 24 32 40 48 56 64 |//
- //| * * * * * * * * * |//
- //| | ' ' ' | ' ' ' | |//
- //| 00 *-- +----+----+----+----+----+----+----+----+ --* |//
- //| | | | | | | | | | |//
- //| 08 *-- +----+----+----+----+----+----+----+----+ |//
- //| | | | | | | |[02]| | |//
- //| 16 *-- +----+----+----+----+----+----+----+----+ |//
- //| | | | | | |//
- //| 24 *-- +----+ [0] + +----+ |//
- //| | | | | | |//
- //| 32 *-- +----+----+----+ [3] +----+ --* |//
- //| | | | | | | |//
- //| 40 *-- +----+----+----+ +----+ |//
- //| | | | | | | |//
- //| 48 *-- +----+----+----+----+----+----+----+----+ |//
- //| | |[01]| | | | | | | |//
- //| 56 *-- +----+----+----+----+----+----+----+----+ |//
- //| | | | | | | | | | |//
- //| 64 *-- +----+----+----+----+----+----+----+----+ --* |//
- //| | | | |//
- //| * * * |//
- //|__________________________________________________________|//
- var scale_factor =( 10 );
- //: [0]: INPUT VIEWPORT:
- var rec_vp0 ={
- x_0 : ( 8 ) * scale_factor
- , y_0 : ( 16 ) * scale_factor
- , x_1 : ( 24 - 1 ) * scale_factor
- , y_1 : ( 32 - 1 ) * scale_factor
- };; Object.seal( rec_vp0 );
- //: [1]: INPUT VIEWPORT:
- var rec_vp1 ={
- x_0 : ( 8 ) * scale_factor
- , y_0 : ( 48 ) * scale_factor
- , x_1 : ( 16 - 1 ) * scale_factor
- , y_1 : ( 56 - 1 ) * scale_factor
- };;Object.seal( rec_vp1 );
- //: [2]: INPUT VIEWPORT:
- var rec_vp2 ={
- x_0 : ( 48 ) * scale_factor
- , y_0 : ( 8 ) * scale_factor
- , x_1 : ( 56 - 1 ) * scale_factor
- , y_1 : ( 16 - 1 ) * scale_factor
- };;Object.seal( rec_vp2 );
- //: [3]: INPUT VIEWPORT:
- var rec_vp3 ={
- x_0 : ( 24 ) * scale_factor
- , y_0 : ( 16 ) * scale_factor
- , x_1 : ( 56 - 1 ) * scale_factor
- , y_1 : ( 48 - 1 ) * scale_factor
- };;Object.seal( rec_vp3 );
- var rec_pak ={
- rec_vp0 : rec_vp0
- , rec_vp1 : rec_vp1
- , rec_vp2 : rec_vp2
- , rec_vp3 : rec_vp3
- };;Object.seal( rec_pak );
- return( rec_pak );
- };;
- //://////////////////////////////////////////////////////////://
- //: Main function to execute once all script is loaded:
- function main(){
- //: Create a [ can / canvas ]:
- var can = attachCanvasToDom();
- //:Has pixel putting and getting functions:
- var canvas_adapter =( NEW_CanvasAdapter( can ) );
- //:Some rectangles we want to map onto each other:
- var rec_pak = GetRectanglePackage( );
- //: Verify viewport regions:
- ViewportFillTest( canvas_adapter, rec_pak );
- //: Fill viewports with test pattern:
- FillViewportWithTestPattern(
- canvas_adapter
- , rec_pak.rec_vp1 /** bou_rec **/
- );;
- FillViewportWithTestPattern(
- canvas_adapter
- , rec_pak.rec_vp2 /** bou_rec **/
- );;
- FillViewportWithTestPattern(
- canvas_adapter
- , rec_pak.rec_vp3 /** bou_rec **/
- );;
- //:******************************************************://
- //:******************************************************://
- //:******************************************************://
- //:******************************************************://
- //: NOTICE ME!
- //: Map viewport 2 (rec_vp2) onto viewport 0 (rec_vp0)
- var rec_src = rec_pak.rec_vp2; //: [vp1|vp2|vp3]
- var rec_dst = rec_pak.rec_vp0;
- DoMapping(
- canvas_adapter
- , rec_src //:source______rectangle
- , rec_dst //:destination_rectangle
- );;
- //:******************************************************://
- //:******************************************************://
- //:******************************************************://
- //:******************************************************://
- };;
- //://////////////////////////////////////////////////////////://
- function DoMapping(
- canvas_adapter
- , rec_src //:source______rectangle
- , rec_dst //:destination_rectangle
- ){
- //:SOURCE:
- var sx0 = rec_src.x_0;
- var sx1 = rec_src.x_1;
- var sy0 = rec_src.y_0;
- var sy1 = rec_src.y_1;
- //:DEST:
- var dx0 = rec_dst.x_0;
- var dx1 = rec_dst.x_1;
- var dy0 = rec_dst.y_0;
- var dy1 = rec_dst.y_1;
- var rgb=[1,2,3,4];//:rgba
- //:Iterate over each pixel of viewport:
- for(var d_x = dx0; d_x <= dx1; d_x++){
- for(var d_y = dy0; d_y <= dy1; d_y++){
- //: Percentages (dpx & spy):
- //: dpx = (d_x - dx0) / ( dx1 - dx0 )
- //: spx = (s_x - sx0) / ( sx1 - sx0 )
- //:........................SOLVE_FOR
- //:..........................|||
- //:..........................VVV
- //: (d_x-dx0)/(dx1-dx0) === (s_x-sx0)/(sx1-sx0)
- //:((d_x-dx0)/(dx1-dx0))*(sx1-sx0) === s_x-sx0
- //:(((d_x-dx0)/(dx1-dx0))*(sx1-sx0))+sx0 === s_x
- var s_x =(((d_x-dx0)/(dx1-dx0))*(sx1-sx0))+sx0;
- var s_y =(((d_y-dy0)/(dy1-dy0))*(sy1-sy0))+sy0;
- s_x = Math.floor( s_x );
- s_y = Math.floor( s_y );
- canvas_adapter.GetPix(s_x,s_y,rgb);
- canvas_adapter.PutPix(d_x,d_y,rgb);;
- };;};;
- canvas_adapter.Apply();
- };;
- //://////////////////////////////////////////////////////////://
- function attachCanvasToDom(){
- //:C: [ can / canvas ] Creation:
- //:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC://
- //:Create Canvas and append to body: ------------------- ://
- var can = document.createElement('canvas');
- document.body.appendChild(can);
- //: Make canvas non-zero in size, so we can see it:
- can.width = 640;
- can.height= 640;
- //: Get the context, fill [ can / canvas ] to get visual:
- var ctx = can.getContext("2d");
- ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
- ctx.fillRect(0,0,can.width, can.height);
- //:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC://
- //:Return the canvas that was created:
- return( can );
- };;
- //://////////////////////////////////////////////////////////://
- function NEW_CanvasAdapter( can ){
- var canvas_adapter =( new CanvasAdapterClass( can ) );
- return( canvas_adapter );
- };;
- //://////////////////////////////////////////////////////////://
- //:Canvas Adapter Class:
- function CanvasAdapterClass( can /** canvas **/ ){
- var self=( this );
- //Publicly Exposed Functions
- //:PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE://
- this.PutPix = _putPix;
- this.GetPix = _getPix;
- this.Apply = _apply;
- //:PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE://
- if(!can){
- throw("[NilCanvasGivenToPenConstruct:2020_05_06]");
- };;
- function _constructor( canvas_adapter /** self **/ ){
- //://////////////////////////////////////////////////://
- //: Setup inclusive bounds:
- var x0 = 0;
- var x1 = can.width - 1;
- var y0 = 0;
- var y1 = can.height -1;
- //: Iterate over entire [can / canvas], and set pixels:
- var rgb=[1,2,3,4];
- for(var x = x0; x <= x1; x++){
- for(var y = y0; y <= y1; y++){
- rgb[0]= x%256;
- rgb[1]= y%256;
- rgb[2]= (x+y)%256;
- rgb[3]= 255;
- canvas_adapter.PutPix( x, y, rgb );
- };;};; //:next X/Y
- //: Show changes on screen:
- canvas_adapter.Apply();
- //://////////////////////////////////////////////////://
- };;
- var _can = can;
- var _ctx = can.getContext("2d");
- //:Cache size of canvas and handles to internal data.
- var _w = _can.width;
- var _h = _can.height;
- var img_dat = _ctx.createImageData(_w,_h); //: _絵資
- var dat_dat = img_dat.data; //: _筆
- function _putPix(x,y,inn_rgb /** rgb:[r,g,b,a] **/ ){
- //:Convert XY to index:
- var dex = ( (y*4) * _w) + (x*4);
- dat_dat[dex+0] = inn_rgb[0];
- dat_dat[dex+1] = inn_rgb[1];
- dat_dat[dex+2] = inn_rgb[2];
- dat_dat[dex+3] = inn_rgb[3];
- };;
- function _getPix(x,y,out_rgb /** rgb:[r,g,b,a] **/ ){
- //:Convert XY to index:
- var dex = ( (y*4) * _w) + (x*4);
- out_rgb[ 0 ] = dat_dat[dex+0];
- out_rgb[ 1 ] = dat_dat[dex+1];
- out_rgb[ 2 ] = dat_dat[dex+2];
- out_rgb[ 3 ] = dat_dat[dex+3];
- };;
- function _apply(){
- _ctx.putImageData( img_dat, 0,0 );
- };;
- _constructor( self );
- };;
- //://////////////////////////////////////////////////////////://
- function FillViewportWithTestPattern(
- canvas_adapter
- , bou_rec
- ){
- var d_x =Math.abs( bou_rec.x_1 - bou_rec.x_0 );
- var d_y =Math.abs( bou_rec.y_1 - bou_rec.y_0 );
- var out_rad =( Math.min( d_x , d_y ) )/2;
- var inn_rad =( out_rad / 4 );
- //:Center of viewport:
- var c_x = ( bou_rec.x_0 + bou_rec.x_1 ) / 2;
- var c_y = ( bou_rec.y_0 + bou_rec.y_1 ) / 2;
- var rgb=[1,2,3,4];
- //:Iterate over each pixel of viewport:
- for(var x = bou_rec.x_0; x <= bou_rec.x_1; x++){
- for(var y = bou_rec.y_0; y <= bou_rec.y_1; y++){
- //:Current pixel's distance from center of viewport:
- var dst = Math.sqrt(
- Math.pow( c_x - x , 2 )
- +
- Math.pow( c_y - y , 2 )
- );;
- //: If point is inside [ ring / tube ],color.
- if( inn_rad <= dst&&dst <= out_rad ){
- rgb[0] = ( x < c_x ) ? 32 : 128;
- rgb[1] = ( y < c_y ) ? 32 : 128;
- rgb[2] = ( dst * 16 ) % 256;
- rgb[3] = ( 255 ); //:FullOpacity.
- canvas_adapter.PutPix( x, y, rgb );
- };;
- };;};; //:next X/Y
- canvas_adapter.Apply();
- };;
- //://////////////////////////////////////////////////////////://
- function ViewportFillTest(
- canvas_adapter
- , rec_pak
- ){
- "use strict"
- if(!canvas_adapter){ throw("[INPUT:NULL_CANVAS_ADAPTER]");};
- if(!rec_pak ){ throw("[INPUT:NULL:rec_pak]"); };
- for( var pro_nam in rec_pak /**collection**/ ){
- var bou_rec = rec_pak[ pro_nam ];
- //: Setup inclusive bounds:
- var x_0 = bou_rec.x_0;
- var x_1 = bou_rec.x_1;
- var y_0 = bou_rec.y_0;
- var y_1 = bou_rec.y_1;
- var rgb=[128,128,128,255];
- //: Iterate over entire [can / canvas], and set pixels:
- for(var x = x_0; x <= x_1; x++){
- for(var y = y_0; y <= y_1; y++){
- canvas_adapter.PutPix(x,y,rgb);
- };;};; //:next X/Y
- };;//:next[ bou_rec ]
- //: Show changes on screen:
- canvas_adapter.Apply();
- };;
- //://////////////////////////////////////////////////////////://
- main();
- //://////////////////////////////////////////////////////////://
- //://///////////////////////////////////////:// </script></html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement