spectrum.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. #include "spectrum.h"
  2. #include <QFile>
  3. #include <QJsonObject>
  4. #include <QJsonDocument>
  5. Spectrum::Spectrum(QQuickItem* parent)
  6. : QQuickPaintedItem{parent}
  7. {
  8. // 创建QCustomPlot对象
  9. m_pCustomPlot = new QCustomPlot();
  10. // configure axis rect:
  11. m_pCustomPlot->setInteractions(QCP::iRangeDrag|QCP::iRangeZoom); // this will also allow rescaling the color scale by dragging/zooming
  12. m_pCustomPlot->axisRect()->setupFullAxesBox(true);
  13. m_pCustomPlot->setOpenGl(true);
  14. m_pCustomPlot->xAxis->setLabel("时间(T/s)");
  15. m_pCustomPlot->yAxis->setLabel("频率(F/Hz)");
  16. m_pCustomPlot->xAxis->setVisible(false);
  17. m_pCustomPlot->yAxis->setVisible(false);
  18. m_pCustomPlot->xAxis2->setVisible(false);
  19. m_pCustomPlot->yAxis2->setVisible(false);
  20. // 创建QCPColorMap
  21. m_pColorMap = new QCPColorMap(m_pCustomPlot->xAxis, m_pCustomPlot->yAxis);
  22. int nx = 16000 / 128 * (9.856);
  23. int ny = 128;
  24. m_pColorMap->data()->setSize(nx, ny); // we want the color map to have nx * ny data points
  25. m_pColorMap->data()->setRange(QCPRange(0, 10), QCPRange(0, 8000)); // and span the coordinate range -4..4 in both key (x) and value (y) dimensions
  26. // now we assign some data, by accessing the QCPColorMapData instance of the color map:
  27. QFile file(":/data.txt");
  28. file.open(QIODevice::ReadOnly);
  29. quint64 num = 0;
  30. for (int xIndex=0; xIndex<nx; ++xIndex)
  31. {
  32. for (int yIndex=0; yIndex<ny; ++yIndex)
  33. {
  34. if(file.atEnd())
  35. goto end;
  36. QByteArray byteArray = file.readLine();
  37. QString str = QString(byteArray);
  38. str.remove("\n");
  39. QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8());
  40. QJsonObject obj = doc.object();
  41. m_pColorMap->data()->setCell(xIndex, yIndex, obj["s"].toDouble());
  42. ++num;
  43. }
  44. }
  45. end:
  46. qDebug() << "num" << num;
  47. // while(!file.atEnd())
  48. // {
  49. // QByteArray byteArray = file.readLine();
  50. // QString str = QString(byteArray);
  51. // str.remove("\n");
  52. // QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8());
  53. // QJsonObject obj = doc.object();
  54. // m_pColorMap->data()->setCell(obj["t"].toDouble(), obj["f"].toDouble(), obj["s"].toDouble());
  55. // }
  56. file.close();
  57. // double x, y, z;
  58. // for (int xIndex=0; xIndex<nx; ++xIndex)
  59. // {
  60. // for (int yIndex=0; yIndex<ny; ++yIndex)
  61. // {
  62. // m_pColorMap->data()->cellToCoord(xIndex, yIndex, &x, &y);
  63. // double r = 3*qSqrt(x*x+y*y)+1e-2;
  64. // z = 2*x*(qCos(r+2)/r-qSin(r+2)/r); // the B field strength of dipole radiation (modulo physical constants)
  65. // m_pColorMap->data()->setCell(xIndex, yIndex, z);
  66. // }
  67. // }
  68. // add a color scale:
  69. // QCPColorScale *colorScale = new QCPColorScale(m_pCustomPlot);
  70. // m_pCustomPlot->plotLayout()->addElement(0, 1, colorScale); // add it to the right of the main axis rect
  71. // colorScale->setType(QCPAxis::atRight); // scale shall be vertical bar with tick/axis labels right (actually atRight is already the default)
  72. // m_pColorMap->setColorScale(colorScale); // associate the color map with the color scale
  73. // colorScale->axis()->setLabel("Magnetic Field Strength");
  74. // set the color gradient of the color map to one of the presets:
  75. QCPColorGradient customGradient;
  76. customGradient.clearColorStops();
  77. customGradient.setColorInterpolation(QCPColorGradient::ciRGB);
  78. customGradient.setLevelCount(256); // 设置颜色级别的数量
  79. customGradient.setColorStopAt(0.0000, "#010101");
  80. customGradient.setColorStopAt(0.0039, "#010202");
  81. customGradient.setColorStopAt(0.0078, "#020202");
  82. customGradient.setColorStopAt(0.0118, "#020303");
  83. customGradient.setColorStopAt(0.0157, "#020304");
  84. customGradient.setColorStopAt(0.0196, "#020405");
  85. customGradient.setColorStopAt(0.0235, "#020506");
  86. customGradient.setColorStopAt(0.0275, "#030607");
  87. customGradient.setColorStopAt(0.0314, "#030708");
  88. customGradient.setColorStopAt(0.0353, "#03080A");
  89. customGradient.setColorStopAt(0.0392, "#03090C");
  90. customGradient.setColorStopAt(0.0431, "#030A0E");
  91. customGradient.setColorStopAt(0.0471, "#030C10");
  92. customGradient.setColorStopAt(0.0510, "#030D11");
  93. customGradient.setColorStopAt(0.0549, "#030E13");
  94. customGradient.setColorStopAt(0.0588, "#020F15");
  95. customGradient.setColorStopAt(0.0627, "#021017");
  96. customGradient.setColorStopAt(0.0667, "#021119");
  97. customGradient.setColorStopAt(0.0706, "#02121B");
  98. customGradient.setColorStopAt(0.0745, "#02131E");
  99. customGradient.setColorStopAt(0.0784, "#011420");
  100. customGradient.setColorStopAt(0.0824, "#011522");
  101. customGradient.setColorStopAt(0.0863, "#011624");
  102. customGradient.setColorStopAt(0.0902, "#011726");
  103. customGradient.setColorStopAt(0.0941, "#011828");
  104. customGradient.setColorStopAt(0.0980, "#00192B");
  105. customGradient.setColorStopAt(0.1020, "#001A2D");
  106. customGradient.setColorStopAt(0.1059, "#001B2F");
  107. customGradient.setColorStopAt(0.1098, "#001B32");
  108. customGradient.setColorStopAt(0.1137, "#001C34");
  109. customGradient.setColorStopAt(0.1176, "#001D36");
  110. customGradient.setColorStopAt(0.1216, "#001E39");
  111. customGradient.setColorStopAt(0.1255, "#001E3B");
  112. customGradient.setColorStopAt(0.1294, "#011F3E");
  113. customGradient.setColorStopAt(0.1333, "#012040");
  114. customGradient.setColorStopAt(0.1373, "#012043");
  115. customGradient.setColorStopAt(0.1412, "#022145");
  116. customGradient.setColorStopAt(0.1451, "#032148");
  117. customGradient.setColorStopAt(0.1490, "#04224A");
  118. customGradient.setColorStopAt(0.1529, "#05234D");
  119. customGradient.setColorStopAt(0.1569, "#06234F");
  120. customGradient.setColorStopAt(0.1608, "#082352");
  121. customGradient.setColorStopAt(0.1647, "#092454");
  122. customGradient.setColorStopAt(0.1686, "#0B2456");
  123. customGradient.setColorStopAt(0.1725, "#0D2559");
  124. customGradient.setColorStopAt(0.1765, "#0F255B");
  125. customGradient.setColorStopAt(0.1804, "#11255E");
  126. customGradient.setColorStopAt(0.1843, "#132560");
  127. customGradient.setColorStopAt(0.1882, "#152663");
  128. customGradient.setColorStopAt(0.1922, "#172665");
  129. customGradient.setColorStopAt(0.1961, "#192668");
  130. customGradient.setColorStopAt(0.2000, "#1B266A");
  131. customGradient.setColorStopAt(0.2039, "#1D266C");
  132. customGradient.setColorStopAt(0.2078, "#1F266F");
  133. customGradient.setColorStopAt(0.2118, "#212671");
  134. customGradient.setColorStopAt(0.2157, "#232673");
  135. customGradient.setColorStopAt(0.2196, "#262676");
  136. customGradient.setColorStopAt(0.2235, "#282678");
  137. customGradient.setColorStopAt(0.2275, "#2A267A");
  138. customGradient.setColorStopAt(0.2314, "#2C267C");
  139. customGradient.setColorStopAt(0.2353, "#2E267E");
  140. customGradient.setColorStopAt(0.2392, "#312680");
  141. customGradient.setColorStopAt(0.2431, "#332682");
  142. customGradient.setColorStopAt(0.2471, "#352584");
  143. customGradient.setColorStopAt(0.2510, "#372586");
  144. customGradient.setColorStopAt(0.2549, "#3A2588");
  145. customGradient.setColorStopAt(0.2588, "#3C248A");
  146. customGradient.setColorStopAt(0.2627, "#3E248B");
  147. customGradient.setColorStopAt(0.2667, "#41248D");
  148. customGradient.setColorStopAt(0.2706, "#43238F");
  149. customGradient.setColorStopAt(0.2745, "#452390");
  150. customGradient.setColorStopAt(0.2784, "#482392");
  151. customGradient.setColorStopAt(0.2824, "#4A2293");
  152. customGradient.setColorStopAt(0.2863, "#4C2295");
  153. customGradient.setColorStopAt(0.2902, "#4F2196");
  154. customGradient.setColorStopAt(0.2941, "#512197");
  155. customGradient.setColorStopAt(0.2980, "#542098");
  156. customGradient.setColorStopAt(0.3020, "#562099");
  157. customGradient.setColorStopAt(0.3059, "#581F9A");
  158. customGradient.setColorStopAt(0.3098, "#5B1F9B");
  159. customGradient.setColorStopAt(0.3137, "#5D1E9C");
  160. customGradient.setColorStopAt(0.3176, "#5F1D9D");
  161. customGradient.setColorStopAt(0.3216, "#621D9E");
  162. customGradient.setColorStopAt(0.3255, "#641C9F");
  163. customGradient.setColorStopAt(0.3294, "#671C9F");
  164. customGradient.setColorStopAt(0.3333, "#691BA0");
  165. customGradient.setColorStopAt(0.3373, "#6B1BA0");
  166. customGradient.setColorStopAt(0.3412, "#6E1AA1");
  167. customGradient.setColorStopAt(0.3451, "#701AA1");
  168. customGradient.setColorStopAt(0.3490, "#7219A1");
  169. customGradient.setColorStopAt(0.3529, "#7519A2");
  170. customGradient.setColorStopAt(0.3569, "#7718A2");
  171. customGradient.setColorStopAt(0.3608, "#7918A2");
  172. customGradient.setColorStopAt(0.3647, "#7C17A2");
  173. customGradient.setColorStopAt(0.3686, "#7E17A2");
  174. customGradient.setColorStopAt(0.3725, "#8017A2");
  175. customGradient.setColorStopAt(0.3765, "#8316A1");
  176. customGradient.setColorStopAt(0.3804, "#8516A1");
  177. customGradient.setColorStopAt(0.3843, "#8716A1");
  178. customGradient.setColorStopAt(0.3882, "#8916A1");
  179. customGradient.setColorStopAt(0.3922, "#8C16A0");
  180. customGradient.setColorStopAt(0.3961, "#8E16A0");
  181. customGradient.setColorStopAt(0.4000, "#90169F");
  182. customGradient.setColorStopAt(0.4039, "#92169F");
  183. customGradient.setColorStopAt(0.4078, "#94169E");
  184. customGradient.setColorStopAt(0.4118, "#96169D");
  185. customGradient.setColorStopAt(0.4157, "#99169D");
  186. customGradient.setColorStopAt(0.4196, "#9B179C");
  187. customGradient.setColorStopAt(0.4235, "#9D179B");
  188. customGradient.setColorStopAt(0.4275, "#9F179A");
  189. customGradient.setColorStopAt(0.4314, "#A11899");
  190. customGradient.setColorStopAt(0.4353, "#A31898");
  191. customGradient.setColorStopAt(0.4392, "#A51997");
  192. customGradient.setColorStopAt(0.4431, "#A71A96");
  193. customGradient.setColorStopAt(0.4471, "#A91A95");
  194. customGradient.setColorStopAt(0.4510, "#AB1B94");
  195. customGradient.setColorStopAt(0.4549, "#AD1C93");
  196. customGradient.setColorStopAt(0.4588, "#AF1D92");
  197. customGradient.setColorStopAt(0.4627, "#B11D91");
  198. customGradient.setColorStopAt(0.4667, "#B31E90");
  199. customGradient.setColorStopAt(0.4706, "#B51F8E");
  200. customGradient.setColorStopAt(0.4745, "#B7208D");
  201. customGradient.setColorStopAt(0.4784, "#B8218C");
  202. customGradient.setColorStopAt(0.4824, "#BA228B");
  203. customGradient.setColorStopAt(0.4863, "#BC2389");
  204. customGradient.setColorStopAt(0.4902, "#BE2488");
  205. customGradient.setColorStopAt(0.4941, "#C02587");
  206. customGradient.setColorStopAt(0.4980, "#C12785");
  207. customGradient.setColorStopAt(0.5020, "#C32884");
  208. customGradient.setColorStopAt(0.5059, "#C52982");
  209. customGradient.setColorStopAt(0.5098, "#C62A81");
  210. customGradient.setColorStopAt(0.5137, "#C82B80");
  211. customGradient.setColorStopAt(0.5176, "#CA2D7E");
  212. customGradient.setColorStopAt(0.5216, "#CB2E7D");
  213. customGradient.setColorStopAt(0.5255, "#CD2F7B");
  214. customGradient.setColorStopAt(0.5294, "#CE307A");
  215. customGradient.setColorStopAt(0.5333, "#D03278");
  216. customGradient.setColorStopAt(0.5373, "#D13377");
  217. customGradient.setColorStopAt(0.5412, "#D33475");
  218. customGradient.setColorStopAt(0.5451, "#D43674");
  219. customGradient.setColorStopAt(0.5490, "#D63772");
  220. customGradient.setColorStopAt(0.5529, "#D73971");
  221. customGradient.setColorStopAt(0.5569, "#D93A6F");
  222. customGradient.setColorStopAt(0.5608, "#DA3C6E");
  223. customGradient.setColorStopAt(0.5647, "#DB3D6D");
  224. customGradient.setColorStopAt(0.5686, "#DD3F6B");
  225. customGradient.setColorStopAt(0.5725, "#DE406A");
  226. customGradient.setColorStopAt(0.5765, "#DF4268");
  227. customGradient.setColorStopAt(0.5804, "#E14367");
  228. customGradient.setColorStopAt(0.5843, "#E24565");
  229. customGradient.setColorStopAt(0.5882, "#E34664");
  230. customGradient.setColorStopAt(0.5922, "#E44863");
  231. customGradient.setColorStopAt(0.5961, "#E54961");
  232. customGradient.setColorStopAt(0.6000, "#E64B60");
  233. customGradient.setColorStopAt(0.6039, "#E74D5E");
  234. customGradient.setColorStopAt(0.6078, "#E94E5D");
  235. customGradient.setColorStopAt(0.6118, "#EA505C");
  236. customGradient.setColorStopAt(0.6157, "#EB525B");
  237. customGradient.setColorStopAt(0.6196, "#EC5359");
  238. customGradient.setColorStopAt(0.6235, "#ED5558");
  239. customGradient.setColorStopAt(0.6275, "#ED5757");
  240. customGradient.setColorStopAt(0.6314, "#EE5956");
  241. customGradient.setColorStopAt(0.6353, "#EF5A54");
  242. customGradient.setColorStopAt(0.6392, "#F05C53");
  243. customGradient.setColorStopAt(0.6431, "#F15E52");
  244. customGradient.setColorStopAt(0.6471, "#F26051");
  245. customGradient.setColorStopAt(0.6510, "#F26150");
  246. customGradient.setColorStopAt(0.6549, "#F3634F");
  247. customGradient.setColorStopAt(0.6588, "#F4654E");
  248. customGradient.setColorStopAt(0.6627, "#F5674D");
  249. customGradient.setColorStopAt(0.6667, "#F5694C");
  250. customGradient.setColorStopAt(0.6706, "#F66B4B");
  251. customGradient.setColorStopAt(0.6745, "#F66C4A");
  252. customGradient.setColorStopAt(0.6784, "#F76E4A");
  253. customGradient.setColorStopAt(0.6824, "#F87049");
  254. customGradient.setColorStopAt(0.6863, "#F87248");
  255. customGradient.setColorStopAt(0.6902, "#F87448");
  256. customGradient.setColorStopAt(0.6941, "#F97647");
  257. customGradient.setColorStopAt(0.6980, "#F97847");
  258. customGradient.setColorStopAt(0.7020, "#FA7A46");
  259. customGradient.setColorStopAt(0.7059, "#FA7C46");
  260. customGradient.setColorStopAt(0.7098, "#FA7E46");
  261. customGradient.setColorStopAt(0.7137, "#FB8046");
  262. customGradient.setColorStopAt(0.7176, "#FB8245");
  263. customGradient.setColorStopAt(0.7216, "#FB8446");
  264. customGradient.setColorStopAt(0.7255, "#FB8646");
  265. customGradient.setColorStopAt(0.7294, "#FB8846");
  266. customGradient.setColorStopAt(0.7333, "#FC8A46");
  267. customGradient.setColorStopAt(0.7373, "#FC8C46");
  268. customGradient.setColorStopAt(0.7412, "#FC8E47");
  269. customGradient.setColorStopAt(0.7451, "#FC9048");
  270. customGradient.setColorStopAt(0.7490, "#FC9248");
  271. customGradient.setColorStopAt(0.7529, "#FC9449");
  272. customGradient.setColorStopAt(0.7569, "#FC964A");
  273. customGradient.setColorStopAt(0.7608, "#FB984B");
  274. customGradient.setColorStopAt(0.7647, "#FB9A4C");
  275. customGradient.setColorStopAt(0.7686, "#FB9C4D");
  276. customGradient.setColorStopAt(0.7725, "#FB9E4E");
  277. customGradient.setColorStopAt(0.7765, "#FBA050");
  278. customGradient.setColorStopAt(0.7804, "#FBA251");
  279. customGradient.setColorStopAt(0.7843, "#FAA453");
  280. customGradient.setColorStopAt(0.7882, "#FAA655");
  281. customGradient.setColorStopAt(0.7922, "#FAA857");
  282. customGradient.setColorStopAt(0.7961, "#F9AA58");
  283. customGradient.setColorStopAt(0.8000, "#F9AC5A");
  284. customGradient.setColorStopAt(0.8039, "#F8AE5D");
  285. customGradient.setColorStopAt(0.8078, "#F8B05F");
  286. customGradient.setColorStopAt(0.8118, "#F8B261");
  287. customGradient.setColorStopAt(0.8157, "#F7B463");
  288. customGradient.setColorStopAt(0.8196, "#F7B666");
  289. customGradient.setColorStopAt(0.8235, "#F6B868");
  290. customGradient.setColorStopAt(0.8275, "#F6BA6B");
  291. customGradient.setColorStopAt(0.8314, "#F5BC6E");
  292. customGradient.setColorStopAt(0.8353, "#F4BE70");
  293. customGradient.setColorStopAt(0.8392, "#F4C073");
  294. customGradient.setColorStopAt(0.8431, "#F3C276");
  295. customGradient.setColorStopAt(0.8471, "#F3C379");
  296. customGradient.setColorStopAt(0.8510, "#F2C57C");
  297. customGradient.setColorStopAt(0.8549, "#F2C77F");
  298. customGradient.setColorStopAt(0.8588, "#F1C983");
  299. customGradient.setColorStopAt(0.8627, "#F0CB86");
  300. customGradient.setColorStopAt(0.8667, "#F0CD89");
  301. customGradient.setColorStopAt(0.8706, "#EFCF8C");
  302. customGradient.setColorStopAt(0.8745, "#EFD090");
  303. customGradient.setColorStopAt(0.8784, "#EED293");
  304. customGradient.setColorStopAt(0.8824, "#EED497");
  305. customGradient.setColorStopAt(0.8863, "#EDD59A");
  306. customGradient.setColorStopAt(0.8902, "#EDD79E");
  307. customGradient.setColorStopAt(0.8941, "#ECD9A1");
  308. customGradient.setColorStopAt(0.8980, "#ECDAA5");
  309. customGradient.setColorStopAt(0.9020, "#ECDCA9");
  310. customGradient.setColorStopAt(0.9059, "#ECDEAC");
  311. customGradient.setColorStopAt(0.9098, "#EBDFB0");
  312. customGradient.setColorStopAt(0.9137, "#EBE1B4");
  313. customGradient.setColorStopAt(0.9176, "#EBE2B7");
  314. customGradient.setColorStopAt(0.9216, "#EBE4BB");
  315. customGradient.setColorStopAt(0.9255, "#EBE5BF");
  316. customGradient.setColorStopAt(0.9294, "#EBE6C2");
  317. customGradient.setColorStopAt(0.9333, "#ECE8C6");
  318. customGradient.setColorStopAt(0.9373, "#ECE9C9");
  319. customGradient.setColorStopAt(0.9412, "#ECEACD");
  320. customGradient.setColorStopAt(0.9451, "#EDECD0");
  321. customGradient.setColorStopAt(0.9490, "#EDEDD4");
  322. customGradient.setColorStopAt(0.9529, "#EEEED7");
  323. customGradient.setColorStopAt(0.9569, "#EFEFDB");
  324. customGradient.setColorStopAt(0.9608, "#F0F0DE");
  325. customGradient.setColorStopAt(0.9647, "#F1F2E1");
  326. customGradient.setColorStopAt(0.9686, "#F2F3E4");
  327. customGradient.setColorStopAt(0.9725, "#F3F4E7");
  328. customGradient.setColorStopAt(0.9765, "#F4F5EA");
  329. customGradient.setColorStopAt(0.9804, "#F6F6ED");
  330. customGradient.setColorStopAt(0.9843, "#F7F7F0");
  331. customGradient.setColorStopAt(0.9882, "#F9F8F2");
  332. customGradient.setColorStopAt(0.9922, "#FBF9F5");
  333. customGradient.setColorStopAt(0.9961, "#FDFAF7");
  334. customGradient.setColorStopAt(1.0000, "#FEFBF9");
  335. m_pColorMap->setGradient(customGradient);
  336. // we could have also created a QCPColorGradient instance and added own colors to
  337. // the gradient, see the documentation of QCPColorGradient for what's possible.
  338. // rescale the data dimension (color) such that all data points lie in the span visualized by the color gradient:
  339. m_pColorMap->rescaleDataRange();
  340. // make sure the axis rect and color scale synchronize their bottom and top margins (so they line up):
  341. QCPMarginGroup *marginGroup = new QCPMarginGroup(m_pCustomPlot);
  342. m_pCustomPlot->axisRect()->setMarginGroup(QCP::msBottom|QCP::msTop, marginGroup);
  343. m_pCustomPlot->axisRect()->setAutoMargins(QCP::msNone);
  344. m_pCustomPlot->axisRect()->setMargins(QMargins(0, 0, 0, 0));
  345. m_pCustomPlot->plotLayout()->setMargins(QMargins(0, 0, 0, 0));
  346. m_pCustomPlot->replot();
  347. // colorScale->setMarginGroup(QCP::msBottom|QCP::msTop, marginGroup);
  348. // rescale the key (x) and value (y) axes so the whole color map is visible:
  349. m_pCustomPlot->rescaleAxes();
  350. }
  351. Spectrum::~Spectrum()
  352. {
  353. m_pCustomPlot->removePlottable(m_pColorMap);
  354. delete m_pCustomPlot;
  355. }
  356. void Spectrum::paint(QPainter *painter)
  357. {
  358. m_pCustomPlot->setGeometry(0,0,this->width(),this->height());
  359. painter->drawPixmap(0,0,this->width(),this->height(), m_pCustomPlot->toPixmap());
  360. }