【素材火整站源码】【安卓列表源码】【网络投资源码】scale源码

时间:2024-11-19 09:41:46 编辑:后台订单界面源码 来源:点播直播源码

1.android Matrix.setRotate 和 postRotate的区别
2.大屏适配的几种方式
3.CSS移动端1px(线条/边框)解决方案
4.caffe 中为什么bn层要和scale层一起使用

scale源码

android Matrix.setRotate 和 postRotate的区别

       Matrix主要用于对平面进行平移(Translate),缩放(Scale),旋转(Rotate)以及斜切(Skew)操作。

       ä¸ºç®€åŒ–矩阵变换,Android封装了一系列方法来进行矩阵变换;其中包括:

       set系列方法:setTranslate,setScale,setRotate,setSkew;设置,会覆盖之前的参数。

       pre系列方法:preTranslate,preScale,preRotate,preSkew;矩阵先乘,如M' = M * T(dx, dy)。

       post系列方法:postTranslate,postScale,postRotate,postSkew;矩阵后乘,如M' = T(dx, dy) * M。

       é€šè¿‡å°†å˜æ¢çŸ©é˜µä¸ŽåŽŸå§‹çŸ©é˜µç›¸ä¹˜æ¥è¾¾åˆ°å˜æ¢çš„目的,例如:

       å¹³ç§»ï¼ˆx'=x+tx;y'=y+ty):

       ç¼©æ”¾ï¼ˆx'=sx*x;y'=sy*y):

       æ—‹è½¬ï¼ˆx'=cosβ*x-sinβ*y;y'=sinβ*x+cosβ*y):

       é€‰æ‹©éœ€è¦ç”¨åˆ°å¦‚下的三角函数的公式:

       â‘ sin(α+β)=sinαcosβ+cosαsinβ

       â‘¡cos(α+β)=cosαcosβ-sinαsinβ

       å…¬å¼â‘ å¯ä»¥ç”±å•ä½åœ†æ–¹æ³•æˆ–托勒密定理推导出来。

       æŽ¨å¯¼è¿‡ç¨‹å‚见:/s/blog_fcj.html

       æ–œåˆ‡ï¼ˆx'=x+k1*y;y'=k2*x+y):

       //源码文件:external\skia\legacy\src\core\SkMatrix.cpp

       #define SK_Scalar1 (1.0f)

       #define kMatrixElem SK_Scalar1

       typedef float SkScalar;

       #define SkScalarMul(a, b) ((float)(a) * (b))

       enum {

        kMScaleX, kMSkewX, kMTransX,

        kMSkewY, kMScaleY, kMTransY,

        kMPersp0, kMPersp1, kMPersp2

       };

       void SkMatrix::reset() {

        fMat[kMScaleX] = fMat[kMScaleY] = SK_Scalar1; //其值为1

        fMat[kMSkewX] = fMat[kMSkewY] =

        fMat[kMTransX] = fMat[kMTransY] =

        fMat[kMPersp0] = fMat[kMPersp1] = 0; //其值,全为0

        fMat[kMPersp2] = kMatrixElem; //其值为1

        this->setTypeMask(kIdentity_Mask | kRectStaysRect_Mask);

       }

       void SkMatrix::setTranslate(SkScalar dx, SkScalar dy) {

        if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {

        fMat[kMTransX] = dx; //以新值dx覆盖原值,原值无效了

        fMat[kMTransY] = dy;

        fMat[kMScaleX] = fMat[kMScaleY] = SK_Scalar1; //其值为1

        fMat[kMSkewX] = fMat[kMSkewY] =

        fMat[kMPersp0] = fMat[kMPersp1] = 0; //其值,全为0

        fMat[kMPersp2] = kMatrixElem; //其值为1

        this->setTypeMask(kTranslate_Mask | kRectStaysRect_Mask);

        } else {

        this->reset();

        }

       }

       bool SkMatrix::preTranslate(SkScalar dx, SkScalar dy) {

        if (this->hasPerspective()) {

        SkMatrix m;

        m.setTranslate(dx, dy);

        return this->preConcat(m); //矩阵的先乘运算

        }

        if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {

        fMat[kMTransX] += SkScalarMul(fMat[kMScaleX], dx) +

        SkScalarMul(fMat[kMSkewX], dy); //先乘,需要矩阵运算过

        fMat[kMTransY] += SkScalarMul(fMat[kMSkewY], dx) +

        SkScalarMul(fMat[kMScaleY], dy);

        this->setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);

        }

        return true;

       }

       bool SkMatrix::postTranslate(SkScalar dx, SkScalar dy) {

        if (this->hasPerspective()) {

        SkMatrix m;

        m.setTranslate(dx, dy);

        return this->postConcat(m); //矩阵的后乘运算

        }

        if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {

        fMat[kMTransX] += dx; //后乘,直接加新值dx即可

        fMat[kMTransY] += dy;

        this->setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);

        }

        return true;

       }

       bool SkMatrix::preConcat(

大屏适配的几种方式

       1. rem方案

       根据不同屏幕大小动态调整html根节点的fontsize。

       2. vw/vh方案

       依据设计稿计算相对百分比。

       3. scale 方案

       若设计稿为*(:9),存在两种方案:

       3.1 按宽度缩放

       3.2 动态计算网页的宽高比,决定根据宽度比率还是素材火整站源码高度比率进行缩放

       4.相关开源组件库

       4.1 autofit.js

       autofit.js基于比例缩放原理,通过动态调整容器的安卓列表源码宽度和高度来实现全屏填充,避免元素的挤压或拉伸。autofit.js提供了一种简单而有效的方法来实现网页的自适应设计,尤其适合需要在不同分辨率和屏幕尺寸下保持布局一致性的应用场景。

       安装:

       配置:

       源码地址

       4.2 v-scale-screen

       大屏自适应容器组件,适用于大屏项目开发,实现屏幕自适应。可根据宽度自适应、网络投资源码高度自适应、宽高等比例自适应,全屏自适应(会存在拉伸问题)。如果是59校园系统源码React开发者,可以使用r-scale-screen。

       安装:

       配置:

       源码地址:

       4.3 FitScreen

       一种基于缩放的大屏自适应解决方案的基本方法,基于设计草图的像素尺寸,通过缩放进行适配,象棋引擎原理源码一切变得简单。

       支持vue2、vue3以及react,适用于任何框架,只需少量代码。

       安装:

       配置:

       源码地址:

CSS移动端1px(线条/边框)解决方案

       由于不同的手机有不同的像素密度导致的。如果移动显示屏的分辨率始终是普通屏幕的2倍,1px的边框在devicePixelRatio=2的移动显示屏下会显示成2px,所以在高清瓶下看着1px总是感觉变胖了

       小编阅读过其他作者的文章中有写0.5px的写法,在理论上最小的单位是1px。所以会出现有的设备写0.5px无效(没有边框)的情况。

       如何使用正确的1px单位又能在移动设备上显示1px的效果呢?

       本文将介绍使用CSS3的transform属性的scale值来解决这个问题,这也是最常用的解决方案。下方的源码中说明1px(线条/边框)解决方案

效果对比(效果有点问题,请复制下方源码查看最终效果)源码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"><metaname="author"content="helang.love@qq.com"><title>移动端1px(线条/边框)解决方案</title><styletype="text/css">body{ margin:0;padding:0;font-size:px;color:#;font-family:'MicrosoftYaHei','TimesNewRoman',Times,serif;}/*线条*/.list{ margin:px;list-style:none;line-height:px;padding:0;}.list>li{ padding:0;position:relative;}.list>li:not(:first-child):after{ /*CSS匹配非第一个直接子元素*/content:"";display:block;height:0;border-top:#solid1px;width:%;position:absolute;top:0;right:0;transform:scaleY(0.5);/*将1px的线条缩小为原来的%*/}/*边框*//*其他作者可能会通过设置4个边的线条凑出边框线的效果,这样做不仅代码不够精简,而且调整圆角问题也会非常麻烦*/.button{ line-height:px;text-align:center;margin:px;background-color:#f8f8f8;position:relative;border-radius:4px;}.button:after{ content:"";position:absolute;top:-%;right:-%;bottom:-%;left:-%;border:1pxsolid#;transform:scale(0.5);transform-origin:%%0;box-sizing:border-box;border-radius:8px;/*尺寸缩小%,即圆角半径设置为按钮的2倍*/}</style></head><body><ulclass="list"><li>线条1px</li><li>web前端河浪</li><li>helang.love@qq.com</li></ul><divclass="button">边框1px</div></body></html>

       作者:黄河爱浪邮箱:helang.love@qq.com

caffe 中为什么bn层要和scale层一起使用

       1) 输入归一化 x_norm = (x-u)/std, 其中u和std是个累计计算的均值和方差。

       2)y=alpha×x_norm + beta,对归一化后的x进行比例缩放和位移。其中alpha和beta是通过迭代学习的。

       é‚£ä¹ˆcaffe中的bn层其实只做了第一件事,scale层做了第二件事,所以两者要一起使用。

       ä¸€ï¼Œåœ¨Caffe中使用Batch Normalization需要注意以下两点:

       1. 要配合Scale层一起使用。

       2. è®­ç»ƒçš„时候,将BN层的use_global_stats设置为false,然后测试的时候将use_global_stats设置为true。

       äºŒï¼ŒåŸºæœ¬å…¬å¼æ¢³ç†ï¼š

       Scale层主要完成 top=alpha∗bottom+betatop=alpha∗bottom+beta的过程,则层中主要有两个参数alphaalpha与betabeta,

       æ±‚导会比较简单。∂y∂x=alpha;∂y∂alpha=x;∂y∂beta=1。 需要注意的是alphaalpha与betabeta均为向量,针对输入的channelschannels进行的处理,因此不能简单的认定为一个floatfloat的实数。

       ä¸‰ï¼Œå…·ä½“实现该部分将结合源码实现解析scalescale层:

       åœ¨Caffe proto中ScaleParameter中对Scale有如下几个参数:

       1,基本成员变量,基本成员变量主要包含了Bias层的参数以及Scale层完成对应通道的标注工作。

       2,基本成员函数,主要包含了LayerSetup,Reshape ,Forward和Backward ,内部调用的时候bias_term为true的时候会调用biasLayer的相关函数。

       3,Reshape 调整输入输出与中间变量,Reshape层完成许多中间变量的size初始化。

       4,Forward 前向计算,前向计算,在BN中国紧跟着BN的归一化输出,完成乘以alpha与+bias的操作,由于alpha与bias均为C的向量,因此需要先进行广播。

       5,Backward 反向计算,主要求解三个梯度,对alpha 、beta和输入的bottom(此处的temp)。