duochengdengwan.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. <template>
  2. <view class="math-container">
  3. <view class="header">
  4. <u-image width="100%" height="300rpx" :src="mathImgs[name].big" mode="aspectFit" @click="handleBigImage"></u-image>
  5. </view>
  6. <view class="main dir-top-wrap cross-center">
  7. <view class="form">
  8. <u-form-item label="角度(°)" label-width="180">
  9. <u-input type="digit" v-model="formData.angle" placeholder="请输入角度"/>
  10. </u-form-item>
  11. <u-form-item label="层间距(cm)" label-width="180">
  12. <u-input type="digit" v-model="formData.cengjianju" placeholder="请输入层间距"/>
  13. </u-form-item>
  14. <u-form-item label="已测量层数" label-width="180">
  15. <text @click="cengShow = true" class="select">{{cengTxt}}</text>
  16. <u-select v-model="cengShow" :list="cengList" @confirm="handleSelectCeng"></u-select>
  17. </u-form-item>
  18. <u-form-item label="边高(cm)" label-width="180">
  19. <u-input type="digit" v-model="formData.biangao" placeholder="请输入边高"/>
  20. </u-form-item>
  21. <u-form-item label="起弯(cm)" label-width="180">
  22. <u-input type="digit" v-model="formData.qiwan" placeholder="请输入起弯"/>
  23. </u-form-item>
  24. <u-form-item label="斜边(cm)" label-width="180">
  25. <u-input type="digit" v-model="formData.xiebian" placeholder="选填"/>
  26. </u-form-item>
  27. </view>
  28. <view class="btn-group main-left cross-center">
  29. <u-button :ripple="true" @click="handelCalc" :custom-style="{backgroundColor: $u.color['mainBgColor'],color:'#ffffff',width: '260rpx',marginRight:'30rpx'}">计算</u-button>
  30. <u-button :ripple="true" @click="handleClear">清空</u-button>
  31. </view>
  32. </view>
  33. <div class="footer">
  34. <view class="result dir-top-wrap cross-center" v-if="showResult">
  35. <view v-for="item in rules" v-if="item.value && item.show">
  36. <text>{{item.name}}=</text>{{item.value}}{{item.unit}}
  37. <text v-if="item.isHalf">{{$util.round(item.value/2,2)}}{{item.unit}}</text>
  38. </view>
  39. </view>
  40. <view class="title">计算图</view>
  41. <view class="calc-img">
  42. <text class="diyiceng">{{rules.diyiceng.value?rules.diyiceng.value:'**'}}{{rules.diyiceng.unit}}</text>
  43. <text class="diyicengxiebian">{{rules.diyicengxiebian.value?rules.diyicengxiebian.value:'**'}}{{rules.diyicengxiebian.unit}}</text>
  44. <text class="slice1">{{rules.slice.value?rules.slice.value:'**'}}{{rules.slice.unit}}</text>
  45. <text class="slice2">{{rules.slice.value?rules.slice.value:'**'}}{{rules.slice.unit}}</text>
  46. <text class="dierceng">{{rules.dierceng.value?rules.dierceng.value:'**'}}{{rules.dierceng.unit}}</text>
  47. <text class="diercengxiebian">{{rules.diercengxiebian.value?rules.diercengxiebian.value:'**'}}{{rules.diercengxiebian.unit}}</text>
  48. <text class="slice3">{{rules.slice.value?rules.slice.value:'**'}}{{rules.slice.unit}}</text>
  49. <text class="slice4">{{rules.slice.value?rules.slice.value:'**'}}{{rules.slice.unit}}</text>
  50. <text class="disanceng">{{rules.disanceng.value?rules.disanceng.value:'**'}}{{rules.disanceng.unit}}</text>
  51. <text class="disancengxiebian">{{rules.disancengxiebian.value?rules.disancengxiebian.value:'**'}}{{rules.disancengxiebian.unit}}</text>
  52. <text class="slice5">{{rules.slice.value?rules.slice.value:'**'}}{{rules.slice.unit}}</text>
  53. <text class="slice6">{{rules.slice.value?rules.slice.value:'**'}}{{rules.slice.unit}}</text>
  54. <text class="cengjianju1">{{formData.cengjianju?formData.cengjianju:'**'}}cm</text>
  55. <text class="cengjianju2">{{formData.cengjianju?formData.cengjianju:'**'}}cm</text>
  56. <u-image width="100%" height="600rpx" :src="mathImgs[name].calc" mode="widthFix"></u-image>
  57. </view>
  58. <view class="title">切割图</view>
  59. <u-image width="100%" height="600rpx" :src="mathImgs[name].slice" mode="widthFix"></u-image>
  60. </div>
  61. </view>
  62. </template>
  63. <script>
  64. import mathImgs from "@/core/math-imgs"
  65. // 万能公式
  66. export default {
  67. data() {
  68. return {
  69. name: 'duochengdengwan',
  70. mathImgs: mathImgs,
  71. formData: {
  72. angle: '',
  73. cengjianju: '',
  74. ceng: '1',
  75. biangao: '',
  76. qiwan: '',
  77. xiebian: '',
  78. },
  79. // 用来验证 输入
  80. rules: {
  81. diyiceng: {name:'第一层起弯', value:'',unit:'cm',show: true},
  82. dierceng:{name:'第二层起弯', value:'',unit:'cm',show: true},
  83. disanceng: {name:'第三层起弯', value:'',unit:'cm',show: true},
  84. diyicengxiebian: {name:'第一层斜边', value:'',unit:'cm',show: true},
  85. diercengxiebian:{name:'第二层斜边', value:'',unit:'cm',show: true},
  86. disancengxiebian: {name:'第三层斜边', value:'',unit:'cm',show: true},
  87. slice:{name:'切口', value:'',unit:'cm',show: true,isHalf:true},
  88. },
  89. cengShow: false,
  90. cengList: [
  91. {value: '1',label: '第一层'},
  92. {value: '2',label: '第二层'},
  93. {value: '3',label: '第三层'},
  94. ],
  95. cengTxt: "第一层",
  96. }
  97. },
  98. methods: {
  99. handleBigImage(){
  100. uni.previewImage({
  101. urls: [mathImgs[this.name].big],
  102. });
  103. },
  104. handelCalc(){
  105. if(!this.formData.angle){
  106. this.$u.toast('请输入角度');
  107. return
  108. }
  109. if( this.formData.angle && this.formData.angle > 90){
  110. this.$u.toast('角度不能大于90');
  111. return
  112. }
  113. if(!this.formData.cengjianju){
  114. this.$u.toast('请输入层间距');
  115. return
  116. }
  117. if(!this.formData.biangao){
  118. this.$u.toast('请输入边高');
  119. return
  120. }
  121. this.initRules();
  122. this.formData.angle = parseFloat(this.formData.angle);
  123. this.formData.cengjianju = parseFloat(this.formData.cengjianju);
  124. this.formData.biangao = parseFloat(this.formData.biangao);
  125. this.formData.xiebian = parseFloat(this.formData.xiebian);
  126. this.formData.ceng = parseFloat(this.formData.ceng);
  127. this.formData.cengjianju = parseFloat(this.formData.cengjianju);
  128. this.formData.qiwan = parseFloat(this.formData.qiwan);
  129. /**
  130. * 1、 已知第一层:
  131. 第二层起弯 = 起弯-(边高+层间数)×tan(角度°÷2)
  132. 第三层起弯 = 起弯-(边高+层间数)×tan(角度°÷2)×2
  133. 切口 = 边高×tan(角度°÷2)×2
  134. */
  135. if(this.formData.ceng === 1){
  136. this.rules.diyiceng.value = this.formData.qiwan
  137. this.rules.diyicengxiebian.value = this.formData.xiebian
  138. this.rules.diyiceng.show = false;
  139. this.rules.diyicengxiebian.show = false;
  140. this.rules.dierceng.value = this.formData.qiwan - (this.formData.biangao + this.formData.cengjianju) * this.$util.tan(this.formData.angle / 2);
  141. this.rules.disanceng.value = this.formData.qiwan - (this.formData.biangao + this.formData.cengjianju) * this.$util.tan(this.formData.angle / 2) * 2;
  142. /**
  143. * 1、 已知第一层起弯:
  144. * 第二层起弯 = 起弯-(边高+层间距)×tan(角度°÷2)
  145. * 第三层起弯 = 起弯-(边高+层间距)×tan(角度°÷2)×2
  146. */
  147. if(this.formData.xiebian){
  148. this.rules.diercengxiebian.value = this.formData.xiebian;
  149. this.rules.disancengxiebian.value = this.formData.xiebian;
  150. }
  151. }
  152. /**
  153. * 2、 已知第二层:
  154. 第一层起弯 = 起弯+(边高+层间数)×tan(角度°÷2)
  155. 第三层起弯 = 起弯-(边高+层间数)×tan(角度°÷2)
  156. 切口 = 边高×tan(角度°÷2)×2
  157. */
  158. if(this.formData.ceng === 2){
  159. this.rules.dierceng.value = this.formData.qiwan
  160. this.rules.diercengxiebian.value = this.formData.xiebian
  161. this.rules.dierceng.show = false;
  162. this.rules.diercengxiebian.show = false;
  163. this.rules.diyiceng.value = this.formData.qiwan + (this.formData.biangao + this.formData.cengjianju) * this.$util.tan(this.formData.angle / 2);
  164. this.rules.disanceng.value = this.formData.qiwan - (this.formData.biangao + this.formData.cengjianju) * this.$util.tan(this.formData.angle / 2);
  165. /**
  166. * 1、 已知第二层起弯
  167. * 第一层起弯 = 起弯+(边高+层间数)×tan(角度°÷2)
  168. * 第三层起弯 = 起弯-(边高+层间数)×tan(角度°÷2)
  169. */
  170. if(this.formData.xiebian){
  171. this.rules.diyicengxiebian.value = this.formData.xiebian;
  172. this.rules.disancengxiebian.value = this.formData.xiebian;
  173. }
  174. }
  175. /**
  176. * 3、 已知第三层:
  177. * 第一层起弯 = 起弯+(边高+层间数)×tan(角度°÷2)×4
  178. 第二层起弯 = 起弯+(边高+层间数)×tan(角度°÷2)×2
  179. 切口 = 边高×tan(角度°÷2)×2
  180. */
  181. if(this.formData.ceng === 3){
  182. this.rules.disanceng.value = this.formData.qiwan
  183. this.rules.disancengxiebian.value = this.formData.xiebian
  184. this.rules.disanceng.show = false;
  185. this.rules.disancengxiebian.show = false;
  186. this.rules.diyiceng.value = this.formData.qiwan + (this.formData.biangao + this.formData.cengjianju) * this.$util.tan(this.formData.angle / 2) * 4;
  187. this.rules.dierceng.value = this.formData.qiwan + (this.formData.biangao + this.formData.cengjianju) * this.$util.tan(this.formData.angle / 2) * 2;
  188. /**
  189. * 3、 已知第三层起弯:
  190. * 第一层起弯 = 起弯+(边高+层间数)×tan(角度°÷2)×4
  191. * 第二层起弯 = 起弯+(边高+层间数)×tan(角度°÷2)×2
  192. */
  193. if(this.formData.xiebian){
  194. this.rules.diyicengxiebian.value = this.formData.xiebian
  195. this.rules.diercengxiebian.value = this.formData.xiebian;
  196. }
  197. }
  198. this.rules.slice.value = this.formData.biangao * this.$util.tan(this.formData.angle / 2) * 2;
  199. this.roundRules();
  200. this.$u.toast("请参考计算示意图")
  201. },
  202. roundRules(){
  203. for (const itemKey in this.rules) {
  204. console.log('-->data',this.rules[itemKey].value)
  205. this.rules[itemKey].value = this.$util.round(this.rules[itemKey].value,2);
  206. console.log('-->data',this.rules[itemKey].value)
  207. }
  208. },
  209. initRules(){
  210. for (const itemKey in this.rules) {
  211. this.rules[itemKey].value = "";
  212. this.rules[itemKey].show = true;
  213. }
  214. },
  215. handleSelectCeng(e){
  216. this.formData.ceng = e[0].value;
  217. this.cengTxt = e[0].label;
  218. },
  219. handleClear() {
  220. this.initRules();
  221. this.formData = {
  222. angle: '',
  223. cengjianju: '',
  224. ceng: '1',
  225. biangao: '',
  226. qiwan: '',
  227. xiebian: '',
  228. };
  229. }
  230. },
  231. computed:{
  232. showResult(){
  233. let validate = [];
  234. for (const itemKey in this.rules) {
  235. validate.push(this.rules[itemKey].value);
  236. }
  237. return this.$util.checkArrayNotNullNumber(validate)
  238. }
  239. }
  240. }
  241. </script>
  242. <style lang="scss" scoped>
  243. @import "@/static/css/math.scss";
  244. .diyiceng{
  245. left: 150rpx;
  246. }
  247. .diyicengxiebian{
  248. left: 320rpx;
  249. }
  250. .slice1{
  251. top: 170rpx;
  252. left: 240rpx;
  253. }
  254. .slice2{
  255. top: 170rpx;
  256. left: 445rpx;
  257. }
  258. .dierceng{
  259. top: 190rpx;
  260. left: 170rpx;
  261. }
  262. .diercengxiebian{
  263. top: 190rpx;
  264. left: 340rpx;
  265. }
  266. .slice3{
  267. top: 350rpx;
  268. left: 260rpx;
  269. }
  270. .slice4{
  271. top: 350rpx;
  272. left: 445rpx;
  273. }
  274. .disanceng{
  275. top: 360rpx;
  276. left: 170rpx;
  277. }
  278. .disancengxiebian{
  279. top: 360rpx;
  280. left: 340rpx;
  281. }
  282. .slice5{
  283. top: 520rpx;
  284. left: 280rpx;
  285. }
  286. .slice6{
  287. top: 520rpx;
  288. left: 445rpx;
  289. }
  290. .cengjianju1{
  291. top: 200rpx;
  292. }
  293. .cengjianju2{
  294. top: 370rpx;
  295. }
  296. </style>