【图形处理】如何将一个平面图形按照角度往z轴扭曲【2】-根据左右上下四个边进行旋转

本文介绍了一种通过调整角度和选取旋转边来实现图像3D旋转的技术,并详细解释了如何根据底边、顶边、左边缘或右边缘进行旋转。包括计算投影后的高度和宽度,确定切片尺寸,以及如何使用JavaScript将图像切成多个部分并重新排列以展示不同视角。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好了,这个跟上一个其实是一样的,就是坐标不一样。。虽然可以随便根据某一条边旋转,但是,我还是先做简单的吧。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width,initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"/>

  <meta name="apple-mobile-web-app-capable" content="yes"/>
  <meta name="apple-mobile-web-app-status-bar-style" content="black">
  <meta content="telephone=no,email=no" name="format-detection">
  <meta name="full-screen" content="true"/>
  <%--竖屏--%>
  <%--<meta name="screen-orientation" content="portrait"/>--%>
  <%--横屏--%>
  <%--<meta name="screen-orientation" content="landscape"/>--%>

  <meta name="x5-fullscreen" content="true"/>
  <meta name="360-fullscreen" content="true"/>



  <style>
    body{
      padding: 0;
      margin: 0;
    }
  </style>

</head>
<body>


<div class="">
  <img src="images/forestRoad.jpg" id="image" >
  <img src="" id="preview">
</div>
<script>
  var IMAGE=document.getElementById("image");
  var PREVIEW=document.getElementById("preview");
</script>
<script>

  //    ctx.drawImage(IMAGE);
  //--这是切片方式来生成图片。--up down left right ,请注意 angle的意思是,angle=0的时候是不需要切片生成图片的,因为angle=0表示从正上方看图片的角度。
  //angle=90的是后表示图片刚好垂直于眼神--即是说,这时候眼睛看到的是一条直线--尽量不要用到angle=90的情况。
  //--用angle以后就是计算三角形的坐标了。
  //--用哪一个边作为参考来旋转,默认为bottom,即,根据bottom旋转,top|bottom|left|right

  function transform3dImage(image,segNum,angle,side) {
    var _turn_side="bottom";
    if(side){
      _turn_side=side;
    }
    var tmpCanvas = document.createElement("canvas");
    var tmpCtx = tmpCanvas.getContext("2d");
    var _img_width = image.naturalWidth;
    var _img_height = image.naturalHeight;


    function _bottom_turn_draw(){
      //--计算实际的高度和宽度。
      var _real_height = parseInt(_img_height * Math.cos(angle));
      //--好了,已经算出了投影过去的高度,那么可以知道投影和原始图形之间的比例。
      //--当然,这个比例其实就是cos(angle),就是说,没什么可以计算的,
      //那么现在可以计算出最小的宽度了。
      var _min_width = parseInt(_img_width * Math.cos(angle));
      //根据这一个已经可以得到切片相关图形了。
      tmpCanvas.width = _img_width;
      tmpCanvas.height = _real_height;
      var _seg_width = ((_img_width - _min_width) / segNum);
      var _seg_height = ((_real_height) / segNum);
      var _src_seg_height = (_img_height) / segNum;
      console.log("当前图片尺寸:" + _img_width + " x " + _img_height + ", 投影后尺寸:最小宽度:" + _min_width + " 高度:" + _real_height + " 分片尺寸:" + _seg_width + "x" + _seg_height + "  原始图片分片单位高度:" + _src_seg_height);


      for (var i = 0; i < segNum; i++) {
        var _drawWidth = _min_width + (i + 1) * _seg_width;
        _drawWidth = parseInt(_drawWidth);
        if (_drawWidth > _img_width) {
          _drawWidth = _img_width;
        }
        var _drawHeight = _seg_height;

        var sx = 0;
        var sy = parseInt(i * _src_seg_height);
        var swidth = _img_width;
        var sheight = parseInt(_img_height / segNum);
        var dest_x = parseInt(_img_width / 2 - (_drawWidth) / 2);
        var dest_y = i * _seg_height;
        console.log(" 分片:" + i + " sx:" + sx + ",sy:" + sy + ",swidth:" + _img_width + ",sheight:" + sheight + ",x:" + dest_x + ",y:" + dest_y + ",drawWidth:" + _drawWidth + ",drawHeight:" + _drawHeight);


        tmpCtx.drawImage(image, sx, sy, swidth, sheight, dest_x, dest_y, _drawWidth, _drawHeight);

      }
    }

    function _top_turn_draw(){
      //--计算实际的高度和宽度。
      var _real_height = parseInt(_img_height * Math.cos(angle));
      //--好了,已经算出了投影过去的高度,那么可以知道投影和原始图形之间的比例。
      //--当然,这个比例其实就是cos(angle),就是说,没什么可以计算的,
      //那么现在可以计算出最小的宽度了。
      var _min_width = parseInt(_img_width * Math.cos(angle));
      //根据这一个已经可以得到切片相关图形了。
      tmpCanvas.width = _img_width;
      tmpCanvas.height = _real_height;
      var _seg_width = ((_img_width - _min_width) / segNum);
      var _seg_height = ((_real_height) / segNum);
      var _src_seg_height = (_img_height) / segNum;

      for (var i = 0; i < segNum; i++) {
        var _drawWidth = _img_width - (i) * _seg_width;
        _drawWidth = parseInt(_drawWidth);
        if (_drawWidth > _img_width) {
          _drawWidth = _img_width;
        }
        var _drawHeight = _seg_height;

        var sx = 0;
        var sy = parseInt(i * _src_seg_height);
        var swidth = _img_width;
        var sheight = parseInt(_img_height / segNum);
        var dest_x = parseInt(_img_width / 2 - (_drawWidth) / 2);
        var dest_y = i * _seg_height;
        tmpCtx.drawImage(image, sx, sy, swidth, sheight, dest_x, dest_y, _drawWidth, _drawHeight);

      }
    }

    function _left_turn_draw(){
      //--计算实际的高度和宽度。
      var _real_width = parseInt(_img_width * Math.cos(angle));
      var _min_height = parseInt(_img_height * Math.cos(angle));
      //根据这一个已经可以得到切片相关图形了。
      tmpCanvas.width = _real_width;
      tmpCanvas.height = _img_height;
      var _seg_width = ((_real_width) / segNum);
      var _seg_height = ((_img_height-_min_height) / segNum);
      var _src_seg_height = (_img_height) / segNum;
      var _src_seg_width=(_img_width)/segNum;

      for (var i = 0; i < segNum; i++) {
        var _drawHeight=parseInt(_img_height-(i)*_seg_height);
        if(_drawHeight>_img_height){
          _drawHeight=_img_height;
        }
        var _drawWidth=_seg_width;

        var sx =  parseInt(i*_src_seg_width);
        var sy = 0;
        var swidth = parseInt(_src_seg_width);
        var sheight = _img_height;
        var dest_x = i*_seg_width;// parseInt(_img_width / 2 - (_drawWidth) / 2);
        var dest_y = parseInt(_img_height/2-(_drawHeight)/2);
        tmpCtx.drawImage(image, sx, sy, swidth, sheight, dest_x, dest_y, _drawWidth, _drawHeight);

      }
    }
    function _right_turn_draw(){
      //--计算实际的高度和宽度。
      var _real_width = parseInt(_img_width * Math.cos(angle));
      var _min_height = parseInt(_img_height * Math.cos(angle));
      //根据这一个已经可以得到切片相关图形了。
      tmpCanvas.width = _real_width;
      tmpCanvas.height = _img_height;
      var _seg_width = ((_real_width) / segNum);
      var _seg_height = ((_img_height-_min_height) / segNum);
      var _src_seg_height = (_img_height) / segNum;
      var _src_seg_width=(_img_width)/segNum;

      for (var i = 0; i < segNum; i++) {
        var _drawHeight=parseInt(_min_height+(i+1)*_seg_height);
        if(_drawHeight>_img_height){
          _drawHeight=_img_height;
        }
        var _drawWidth=_seg_width;

        var sx =  parseInt(i*_src_seg_width);
        var sy = 0;
        var swidth = parseInt(_src_seg_width);
        var sheight = _img_height;
        var dest_x = i*_seg_width;// parseInt(_img_width / 2 - (_drawWidth) / 2);
        var dest_y = parseInt(_img_height/2-(_drawHeight)/2);

        tmpCtx.drawImage(image, sx, sy, swidth, sheight, dest_x, dest_y, _drawWidth, _drawHeight);

      }
    }
    if(_turn_side=="top"){
      _top_turn_draw();
    }
    else if(_turn_side=="left"){
      _left_turn_draw();
    }
    else if(_turn_side=="right"){
      _right_turn_draw();
    }
    else{
      _bottom_turn_draw();
    }


    return tmpCanvas;
  }


  function realDraw(segNum,angle,side){
    var _canvas=transform3dImage(IMAGE,segNum,angle,side);
    PREVIEW.src=_canvas.toDataURL("image/png");

  }
</script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值