index.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. const powerMax = 200; // 最大力量值
  2. const powerMin = Math.floor(powerMax/2) + 1; // 最小力量值
  3. const decline = powerMax/10000; // 衰退
  4. export default {
  5. data() {
  6. return {
  7. truntableData: [], // 转盘数据
  8. color: ["#014EB5","#A800FF","#e82edb","#B5454C","#443bff","#e8a425","#ff7aab","#e84b1e","#552ce2","#e8861e","#d441ff","#9c7aff","#014EB5","#A800FF","#e82edb","#B5454C","#443bff","#e8a425","#ff7aab","#e84b1e","#552ce2","#e8861e","#d441ff","#9c7aff","#014EB5","#A800FF","#e82edb","#B5454C","#443bff","#e8a425","#ff7aab","#e84b1e","#552ce2","#e8861e","#d441ff","#9c7aff","#014EB5","#A800FF","#e82edb","#B5454C","#443bff","#e8a425","#ff7aab","#e84b1e","#552ce2","#e8861e","#d441ff","#9c7aff","#014EB5","#A800FF","#e82edb","#B5454C","#443bff","#e8a425","#ff7aab","#e84b1e","#552ce2","#e8861e","#d441ff","#9c7aff","#014EB5","#A800FF","#e82edb","#B5454C","#443bff","#e8a425","#ff7aab","#e84b1e","#552ce2","#e8861e","#d441ff","#9c7aff"],
  9. timerRun: false, // 工具是否已开始
  10. transform: null,
  11. allPower: [], // 力量集合
  12. }
  13. },
  14. props: {
  15. list: Array, // 转盘基础数据。基础数据参照‘list参数’
  16. show: Boolean, // 显示组件:默认不显示
  17. // 每次转完是否默认回起始位置
  18. startPosition: {
  19. type: Boolean,
  20. default: true
  21. },
  22. // 是否启用概率算法,默认按照扇形面积占比的大小出奖。开启概率算法,需要同时设置startPosition为true,否则会出现异常。
  23. probabilityTag: {
  24. type: Boolean,
  25. default: false
  26. },
  27. },
  28. mounted() {
  29. this.init();
  30. },
  31. methods: {
  32. // 隐藏组件
  33. close(){
  34. if(this.timerRun){
  35. uni.showToast({
  36. title: '请耐心等待',
  37. duration: 1500,
  38. icon: "none"
  39. });
  40. return
  41. }
  42. this.$emit("turntableState", false);
  43. },
  44. // 点击开始按钮
  45. go(){
  46. if(this.timerRun){
  47. uni.showToast({
  48. title: '请耐心等待',
  49. duration: 1500,
  50. icon: "none"
  51. });
  52. return
  53. }
  54. this.timerRun = true;
  55. let power = 0;
  56. if (this.probabilityTag) {
  57. power = this.allPower[Math.floor((Math.random()*this.allPower.length))]; //随机获取一个力量值 - 有概率
  58. } else {
  59. power = this.rand(powerMin, powerMax); //随机获取一个力量值 - 无概率
  60. }
  61. let jiaodu = 0; // 旋转的角度
  62. let timer = setInterval(()=>{
  63. if(Number(power.toFixed(4)) <= 0){
  64. clearInterval(timer);
  65. this.getData(jiaodu%360);
  66. }
  67. jiaodu += power;
  68. // #ifdef H5
  69. document.getElementById("rotateBoard").style.transform = 'rotate('+ jiaodu +'deg)';
  70. // #endif
  71. // #ifdef MP-WEIXIN || APP-PLUS
  72. this.transform = 'rotate('+ jiaodu +'deg)'
  73. // #endif
  74. power = (power - power*decline) < decline?0:power - power*decline;
  75. // console.log(power)
  76. }, 10)
  77. },
  78. // 获取[m, n]的随机数
  79. rand(m, n) {
  80. return Math.ceil(Math.random() * (n-m+1) + m-1)
  81. },
  82. // 按照概率获取力量的中奖数据集合
  83. getPowerResult() {
  84. const allPower = [];
  85. for(let i = powerMin; i <= powerMax; i++){
  86. allPower.push(i);
  87. }
  88. this.allPower = this.getModeResult(allPower);
  89. },
  90. // 获取模拟结果
  91. getModeResult(allPower){
  92. const powerPrizes = [];
  93. const tempJs = powerMax - powerMin + 1;
  94. allPower.forEach((item) => {
  95. let power = item; //随机获取一个力量值
  96. let jiaodu = 0; // 旋转的角度
  97. while (Number(power.toFixed(4)) > 0) {
  98. jiaodu += power;
  99. power = (power - power*decline) < decline?0:power - power*decline;
  100. }
  101. const deg = 360 - jiaodu%360;
  102. let prize = null;
  103. let nums = this.list.length;
  104. for(let i = 0; i < nums; i++){
  105. if(this.list[i].start <= deg && deg < this.list[i].start + this.list[i].prop*10){
  106. if (this.list[i].result.length/tempJs < this.list[i].probability) {
  107. this.list[i].result.push(item);
  108. powerPrizes.push(item);
  109. }
  110. break;
  111. }
  112. }
  113. });
  114. // 不够的进行补入
  115. let nums = this.list.length;
  116. for(let i = 0; i < nums; i++){
  117. if (this.list[i].result.length/tempJs < this.list[i].probability) {
  118. const n = Number((Number((this.list[i].probability - this.list[i].result.length/tempJs).toFixed(2)) * tempJs).toFixed(0));
  119. for(let j = 0; j < n; j++){
  120. this.list[i].result.push(this.list[i].result[0]);
  121. powerPrizes.push(this.list[i].result[0]);
  122. }
  123. }
  124. }
  125. return powerPrizes;
  126. },
  127. // 通过旋转得角度,获取当前指向得奖品
  128. getData(deg){
  129. deg = 360 - deg;
  130. let prize = null;
  131. let nums = this.list.length;
  132. for(let i = 0; i < nums; i++){
  133. if(this.list[i].start <= deg && deg < this.list[i].start + this.list[i].prop*10){
  134. prize = this.list[i];
  135. this.$emit("getPrize", prize.state, prize.id, prize.name)
  136. this.timerRun = false;
  137. if (this.startPosition) {
  138. this.initJiaodu();
  139. }
  140. // this.BASE.msg(prize.name, 2000);
  141. break;
  142. }
  143. }
  144. },
  145. // 重置角度
  146. initJiaodu(){
  147. const jiaodu = 0;
  148. setTimeout(() => {
  149. // #ifdef H5
  150. document.getElementById("rotateBoard").style.transform = 'rotate('+ jiaodu +'deg)';
  151. // #endif
  152. // #ifdef MP-WEIXIN || APP-PLUS
  153. this.transform = 'rotate('+ jiaodu +'deg)'
  154. // #endif
  155. }, 10);
  156. },
  157. init(){
  158. let tempStart = 0;
  159. let tempScale = 0;
  160. this.list.forEach((item, i)=>{
  161. item["result"] = []; // 中奖的力量集合
  162. item["scale"] = item.prop*10 - 90; // 所占弧度的度数
  163. item["scaleText"] = tempScale + (90 + (item.prop*10 - 90))/2; // 文字的回旋角度
  164. item["sin"] = Math.sin(Math.PI*2*item.scaleText/360)*160; // 正弦
  165. item["cos"] = Math.cos(Math.PI*2*item.scaleText/360)*160; // 余弦
  166. tempScale = tempScale + 90 + (item.prop*10 - 90);
  167. if(i !== 0){
  168. tempStart = tempStart + this.list[i - 1].prop*10;
  169. }
  170. item["start"] = tempStart;
  171. });
  172. this.truntableData = this.list;
  173. // 按照概率获取力量的中奖数据集合
  174. if (this.probabilityTag) {
  175. this.getPowerResult();
  176. }
  177. },
  178. }
  179. }