/
nea
/
androidGroupBuilder
Обзор
Документация
Войти
/
nea
/
androidGroupBuilder
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/src/main/java/com/ea/groupbuilder/kelyActivity.java
809 строк
38 KB
ea
Группа Автоморфизмов отлажено 23_04_2026
23 апр 2026, 17:08
23 апр 2026, 17:08
4513276
Код
Авторство
О чём код?
package com.ea.groupbuilder; import static java.lang.Math.abs; import androidx.core.view.MotionEventCompat; import android.content.Intent; import android.database.Cursor; import android.graphics.Color; import android.opengl.Matrix; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.WindowManager; import java.util.ArrayList; import java.util.List; public class kelyActivity extends SurfaceHolderActivity { private final static String TAG = "GRUGRA_KELY"; final static private boolean DISPLAYLOG = false; public classKely spaceKely; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); lineFlg = 0; // 0 - отображать все ребра, -1 - не отображать, 1 - id ребер для отображения в masIdPostSelRebro getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); f_set(); } protected void onStop( ) { super.onStop() ; mApp.activityGraph = null; } protected void onDestroy( ) { super.onDestroy(); mApp.activityGraph = null; } protected void onStart(){ super.onStart(); mApp.activityGraph = this; } private MenuItem mItemSn, // Выделение распавших классов mItemAuto; // автоморфиз public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_graph, menu); mItemSn = menu.findItem(R.id.action_grn_sn); mItemSn.setEnabled( dbH.f_testFn() ); mItemAuto = menu.findItem(R.id.action_grn__auto); mItemAuto.setEnabled( ! mApp.tableNameEnd.equals("_a")); return super.onCreateOptionsMenu(menu); } public boolean onPrepareOptionsMenu(Menu menu) { mItemSn.setEnabled( dbH.f_testFn() ); mItemAuto.setEnabled( ! mApp.tableNameEnd.equals("_a")); if (dbH.f_getCountRow("select _id from elements_a;") == 0) mItemAuto.setEnabled(false); return super.onPrepareOptionsMenu(menu); } public boolean onOptionsItemSelected(MenuItem item) { int j; switch (item.getItemId()) { /* case R.id.action_rn_axis: // Отобразить оси item.setChecked( ! item.isChecked()); axisFlg = item.isChecked() ? 1 : 0; break; */ case R.id.action_grn_gr: // Отобразить группу item.setChecked( ! item.isChecked()); gruppFlg = item.isChecked() ? 1 : 0; posCreated = 0; repaint(); break; case R.id.action_grn_sn: // Отобразить группу Sn item.setChecked( ! item.isChecked()); flagSn = item.isChecked(); stopPotok(); for (j = 0; j < valDataRect.size(); j++) { valDataRect.get(j).clickFlag = false; valDataRect.get(j).selectFlag = false; } db.execSQL("delete from temp_pe;"); posCreated = 0; repaint(); break; case R.id.action_grn__auto: // автоморф item.setChecked( ! item.isChecked()); if (item.isChecked()) f_setAuto(); else { autoFlg = 0; } break; case R.id.action_sn_del_reb: // Отобразить Отобразить ребра item.setChecked( ! item.isChecked()); lineFlg = item.isChecked() ? 0 : -1; posCreated = 2; break; case R.id.action_gnazad: finish(); break; case R.id.action_graph_help: Intent intent = new Intent(kelyActivity.this, helpActivity.class); startActivity(intent); break; // раскраска case R.id.action_kelicol1: kakKolop = 1; // По итерациям posCreated = 0; break; case R.id.action_kelicol2: kakKolop = 2; // По классам posCreated = 0; break; case R.id.action_kelicol3: kakKolop = 3; // По цикл типу posCreated = 0; break; case R.id.action_kelicol4: kakKolop = 4; // По P posCreated = 0; break; case R.id.action_kelicol5: kakKolop = 5; // По порядку эл-та posCreated = 0; break; case R.id.action_kelicol6: kakKolop = 6; // По Силову posCreated = 0; break; case R.id.action_kelicol7: kakKolop = 7; // Четные и нечетные posCreated = 0; break; case R.id.action_kelicol8: kakKolop = 8; // По стационарным точкам posCreated = 0; break; case R.id.action_rncol9: kakKolop = 9; // По числу стационарных точек posCreated = 0; break; } return super.onOptionsItemSelected(item); } String kkakSoob = ""; @Override public void f_set() { super.f_set(); setTitle("граф Кэли"); spaceKely = new classKely(vecPovorotStart, tetaStert); spaceKely.f_setAxes(); kakBuild = DbHelper.kakGraphBuild; final String kakStroit[] = {"итерациям", "по классам", "силовским подгруппам", "P", "порядку эл-та", "цикл типу", "четные и нечетные"}; if (kakBuild - 1 < kakStroit.length) kkakSoob = " по " + kakStroit[kakBuild - 1]; view.setOnTouchListener ( new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { final ViewConfiguration conf = ViewConfiguration.get(view.getContext()); // ViewConfiguration.get(mActivy); // системные параметры для DblCklick final int DOUBLE_TAP_TIMEOUT = ViewConfiguration.getDoubleTapTimeout(); // final int doubleTapSlop = conf.getScaledDoubleTapSlop(); int actionCode = MotionEventCompat.getActionMasked(event); int pointerIndex = MotionEventCompat.getActionIndex(event); int finger = event.getPointerId(pointerIndex); int pc = event.getPointerCount(); // число пальцев на экране if (pc > fing.length | finger >= fing.length ) return false; // только FINGERCOUNT пальца int ret = -1, i; double distanceX, distanceY; float xt = event.getX(pointerIndex), yt = event.getY(pointerIndex); long time_now = event.getEventTime(); long deltaTime = time_now - fing[finger].mtime; // Log.d(TAG, "onTouch actionCode = " + actionCode + " " + v.getId()+ " id="+ view.getId() + " xt = " + xt + " yt = " + yt ); /* Log.d(TAG, "onTouchEvent finger=" + finger + " actionCode=" + actionCode + " action=" + action + " xt=" + xt + " yt=" + yt + " e.getYPrecision()X,Y=" + event.getXPrecision() + " " + event.getYPrecision() + " " + view_coor[0]+ " " + view_coor[1]+ " deltaTime="+deltaTime+ " pc="+pc+ " pointerIndex="+pointerIndex); */ switch (actionCode) { case MotionEvent.ACTION_MOVE: // 2 for (i = 0; i < pc; i++) { finger = event.getPointerId(i); // номер пальца = // 0,1,... if (finger < fing.length) { xt = event.getX(i); yt = event.getY(i); fing[finger].setNow(xt, yt); } } if (pc == 1) { finger = event.getPointerId(pointerIndex); // номер пальца distanceX = event.getX() - fing[finger].OldX; distanceY = event.getY() - fing[finger].OldY; if (deltaTime < DOUBLE_TAP_TIMEOUT) { // было смахивание float ln = (float) (Math.sqrt(distanceX * distanceX + distanceY * distanceY)); float velocity = (float) (1000d * ln / Math.abs(deltaTime)); // пикселей / сек if (velocity >= conf.getScaledMinimumFlingVelocity() && velocity <= conf.getScaledMaximumFlingVelocity() && ln > sh / 10.f ) { // Log.d(TAG, " смахивание "); f_allClaer(); ret = 0; } } if (ret < 0 & (distanceX != 0 || distanceY != 0)) { DisplayMetrics metrics = new DisplayMetrics(); // metrics.xdpi = physical pixels per inch mApp.activityGraph.getWindowManager().getDefaultDisplay().getMetrics(metrics); /* Log.d(TAG, "mode= ACTION_MOVE (f_TouchMove) "+distanceX + " "+distanceY+ " finger="+finger+ " old="+fing[finger].OldX + " "+fing[finger].OldY+ " new="+fing[finger].NowX+" new="+fing[finger].NowY+ " metrics.xdpi="+ metrics.xdpi+" ydpi="+ metrics.ydpi ); */ // вращение осей spaceKely.f_TouchMove(fing[finger].OldX, fing[finger].OldY, fing[finger].NowX, fing[finger].NowY, metrics.xdpi, metrics.ydpi); spaceKely.f_setAxes(); posCreated = 2; // пересчитать матрицу и координаты } } if (pc == 2) { float dx0= 0f, dy0 = 0f, dx1= 0f, dy1 = 0f, sz; // , sx=1f, sy=1f l0, l1; int finger1 = event.getPointerId(0); // номер пальца = finger = event.getPointerId(1); // 0,1,... // 0,1,... if (finger < fing.length & finger1 < fing.length) { dx0 += Math.abs( fing[finger].OldX - fing[finger1].OldX); // расстояние между пальцами на начало движения dy0 += Math.abs( fing[finger].OldY - fing[finger1].OldY); dx1 += Math.abs(event.getX(0) - event.getX(1)); // после движения dy1 += Math.abs(event.getY(0) - event.getY(1)); if ((dx0*dx0 + dy0*dy0)>0) { sz = (float) Math.sqrt((dx1*dx1 + dy1*dy1)/(dx0*dx0 + dy0*dy0)); // Log.d(TAG, "mode=f_TouchScale = "+ sz); koeffX *= sz; posCreated = 1; // пересчитать матрицу и координаты } if (abs((dx0*dx0 + dy0*dy0) - (dx1*dx1 + dy1*dy1)) < 18) { startX += 7. * (event.getX(1) - fing[finger].OldX ); startY += 7. * (event.getY(1) - fing[finger].OldY ); /* Log.d(TAG, "mode= ACTION_MOVE (f_TouchMove) x0 "+ fing[finger1].OldX + " x1= "+event.getX(1)+ " y0 "+ fing[finger1].OldY + " y1= "+event.getX(1)+ " finger="+finger+ " finger1="+finger1+ " abs = "+abs((dx0*dx0 + dy0*dy0) - (dx1*dx1 + dy1*dy1))); Log.d(TAG, "mode=f_TouchMove startX = "+ startX + " startY = " + startY); */ } } } for (i = 0; i < pc; i++) { // сохранить новое положение пальцев fing[i].setOld(fing[i].NowX, fing[i].NowY); fing[i].mtime = time_now; } break; case MotionEvent.ACTION_DOWN: // 0 /* Log.d(TAG, "mode=ACTION_DOWN finger="+finger+ " DOUBLE_TAP_TIMEOUT="+DOUBLE_TAP_TIMEOUT+ " deltaTime="+deltaTime +" doubleTapSlop="+doubleTapSlop+ " deltaX="+(fing[finger].OldX - xt) + " deltaY="+(fing[finger].OldY - yt)+ " old="+fing[finger].OldX + " "+fing[finger].OldY+ " new="+xt+" new="+yt ); */ /* if (deltaTime < DOUBLE_TAP_TIMEOUT) { // && deltaTime > DOUBLE_TAP_MIN_TIME) double deltaX = fing[finger].OldX - xt, deltaY = fing[finger].OldY - yt; if ((deltaX * deltaX + deltaY * deltaY) < (doubleTapSlop * doubleTapSlop)) { Log.d(TAG, "сделан двойной клик mode=ACTION_DOWN finger="+finger+ " DOUBLE_TAP_TIMEOUT="+DOUBLE_TAP_TIMEOUT+ " deltaTime="+deltaTime +" doubleTapSlop="+doubleTapSlop+ " deltaX="+(fing[finger].OldX - xt) + " deltaY="+(fing[finger].OldY - yt)+ " old="+fing[finger].OldX + " "+fing[finger].OldY+ " new="+xt+" new="+yt ); //?? f_TouchDbl(xt, yt); } } */ for (i = 0; i < valDataRect.size(); i++) { dataPoint dItem = valDataRect.get(i); if (dItem.f_test( xt - startX, yt - startY )) { dItem.clickFlag = !dItem.clickFlag; if (dItem.clickFlag) { colorSelector.indColor = dItem.colorNum; colorSlt.f_setColor(); txtSoobTouch = "Выбрана " + dItem.f_getSubs() + " id = " + dItem.id + " " + dItem.f_getNameSub(flagSn); } else txtSoobTouch = ""; if (DISPLAYLOG) Log.e(TAG, "onTouch id= " + dItem.id + " # " + " dItem.clickFlag =" + dItem.clickFlag ); } } f_putText(); fing[finger].setOld(xt, yt); fing[finger].mtime = time_now; break; case MotionEvent.ACTION_POINTER_DOWN: // 5 fing[finger].mtime = time_now; fing[finger].setOld(xt, yt); // Log.e(TAG, "setOnTouchListener ACTION_POINTER_DOWN finger = " +finger + " setOld " + xt + " " + yt + " pc = " + pc); break; case MotionEvent.ACTION_POINTER_UP: // 6 // Log.d(TAG, "mode=ACTION_POINTER_UP"); case MotionEvent.ACTION_UP: // 1 // Log.d(TAG, "mode=ACTION_UP"); break; case MotionEvent.ACTION_OUTSIDE: // 4 case MotionEvent.ACTION_CANCEL: // 3 fing[finger].setNull(); // Log.d(TAG, "mode=ACTION_CANCEL"); break; default: break; } v.performClick(); return true; } } ); f_putText(); } protected void f_allClaer() { // перестроить все по смахиванию koeffX = 0.; startX = startY = 0f; Matrix.setIdentityM(spaceKely.modelRotate, 0); Matrix.rotateM(spaceKely.modelRotate, 0, (float) -tetaStert, (float) vecPovorotStart[0], (float) vecPovorotStart[1], (float) vecPovorotStart[2]); spaceKely.f_setAxes(); posCreated = 1; // пересчитать точки и матрицу и координаты if (DISPLAYLOG) Log.e(TAG, "f_allClaer "); } private final double tetaStert = 82.; // угол поворота вокруг вектора private final double [] vecPovorotStart = new double[] {1., 0.0, 0.}; // вектор вокруг которого делается поворот private double otstup = 0d, // отступ сверху жкрана koeffX = 0d; // коэфф сжатия/ растяжения @Override protected void f_paint() { // собственно рисование if (IsCreat) { canvas.drawColor(Color.WHITE); canvas.save(); sh = canvas.getHeight(); sw = canvas.getWidth(); otstup = sh * 0.07; dx = 0.5 * sw; dy = otstup + 0.5 * (sh - otstup); if (koeffX == 0.) koeffX = dy / (DbHelper.faktSubsLen * 2.5); // между точками if (posCreated < 1) { runOnUiThread(new Runnable() { // запустить прогресс бар public void run() { ProgressBr.setVisibility(View.VISIBLE); ProgressBr.setIndeterminate(true); } }); f_readData(); } if (posCreated < 2) { spaceKely.f_setParm(mApp, koeffX, koeffX, dx, dy); } if (menuFlg > 0) { // выбор в всплывающем меню f_menuSelect(); menuFlg = 0; } if (elemFlg > 0) { // выбор в всплывающем меню f_elementSelect(); elemFlg = 0; } if (posCreated < 3) { f_setPos(); // заносит x,y в объекты точки dataSubs f_raskraska(); if (lineCreated == 0) { f_getLinesBuff(); lineCreated = 1; } // if (DISPLAYLOG) // Log.e(TAG, "f_paint posCreated= "+ posCreated + " count = "+ valDataRect.size()); } if (posCreated < 1) { runOnUiThread(new Runnable() { // остановить прогресс бар public void run() { ProgressBr.setVisibility(View.INVISIBLE); ProgressBr.setIndeterminate(false); } }); } posCreated = 3; paintZag.setARGB(255, 0, 0, 0); canvas.drawText((flagSn ? groupName_n : (mApp.tableNameEnd.equals("_a") ? "Автоморфизмы " : "") + mApp.groupName) + kkakSoob, 17f, sh / 20f, paintZag); if (DISPLAYLOG) if (axisFlg > 0) spaceKely.f_putAxes(canvas, paintOs, startX, startY); // вывод точек dataPoint dSub; for (int m = 0; m < valDataRect.size(); m++) { dSub = valDataRect.get(m); colorSelector.indColor = dSub.colorNum; colorSlt.f_setColor(); paintPoint.setARGB(255, colorSelector.rCol, colorSelector.gCol, colorSelector.bCol); if (flagSn) { // выводится Sn, в этом случае выделить точки подгруппы миганием if (gruppFlg > 0) { if (dSub.idSub > 0) { // выбрана точка if (tnrFlag) { f_paintPoint(dSub); } } else { f_paintPoint(dSub); } } else { // if (gruppFlg > 0) //??? f_paintPoint(dSub); } } else { // if (flagSn) if (gruppFlg > 0) { f_paintPoint(dSub); } } // выделение по popup if (dSub.selectFlag) { paintSubGr.setARGB(255, colorSelector.rCol, colorSelector.gCol, colorSelector.bCol); canvas.drawLine(dSub.xPos[0] + startX, dSub.xPos[1] + startY, dSub.xPos[0] + 6 + startX, dSub.xPos[1] - 6 + startY, paintSubGr); canvas.drawLine(dSub.xPos[0] + startX, dSub.xPos[1] + startY, dSub.xPos[0] - 6 + startX, dSub.xPos[1] - 6 + startY, paintSubGr); } } // for (int m = 0; // вывод линий if (lineFlg >= 0) { f_putLines(); } if (autoFlg > 0 ) f_putAuto(); canvas.restore(); } } private void f_readData() { /* чтение подстановок, создание valDataRect flagSn - строит все для Sn, группа как подгруппа Sn kakBuild = установливает раскраску точек 1 - Построение графа Кэли по итерациям 2 - по классам 3 - Построение графа Кэли по силовским подгруппам */ String klch, klch0 = "U", selStr = f_getSQLForReadData(kakBuild); if (DISPLAYLOG) Log.e(TAG, "f_readData " + DbHelper.faktSubsLen + " kakBuild = " + kakBuild + " posCreated = " + posCreated + " flagSn = " + flagSn + " sql= " + selStr); int id, etagN = 0, idgr, countPoints = 0, i, j; // запомнить тапнутые точки List<Integer> tapId = new ArrayList(); // id тапнутых точек List<Integer> selId = new ArrayList(); // id selectFlag точек for (i = 0; i < valDataRect.size(); i++) { if (valDataRect.get(i).clickFlag) { tapId.add(valDataRect.get(i).id); } if (valDataRect.get(i).selectFlag) selId.add(valDataRect.get(i).id); } valDataRect.clear(); spaceKely.arayEtag.clear(); Cursor mCursor = db.rawQuery(selStr, null); if (mCursor.moveToFirst()) { int ik_ = mCursor.getColumnIndex("kluch"), id_ = mCursor.getColumnIndex("_id"), ig_ = mCursor.getColumnIndex("idgr"), // flagSn ? ", link_to_elements idgr" : ", null idgr" is_ = mCursor.getColumnIndex("substitution"); String subs; do { id = mCursor.getInt(id_); idgr = mCursor.getInt(ig_); // _id подгруппы в случае Sn subs = mCursor.getString(is_); // substitution klch = mCursor.getString(ik_); // ключ для раскраски if (klch == null) klch = " "; if ( ! klch.equals(klch0)) { if (countPoints > 0) { spaceKely.arayEtag.add(countPoints); etagN++; } countPoints = 0; klch0 = klch; } if (DISPLAYLOG) Log.e(TAG, "f_readData subs = " + subs + " id = " + id + " flagSn = " + flagSn + " etagN= " + etagN); valDataRect.add(new dataPoint(classSubs, classSubs.f_toArray(subs, DbHelper.faktSubsLen), id, idgr, etagN, 0, mApp.tableNameEnd)); countPoints++; } while (mCursor.moveToNext()); spaceKely.arayEtag.add(countPoints); } mCursor.close(); lineCreated = 0; // тапнуть for (i = 0; i < valDataRect.size(); i++) { id = valDataRect.get(i).id; j = tapId.indexOf(id); if (j >= 0) { valDataRect.get(i).clickFlag = true; } j = selId.indexOf(id); if (j >= 0) valDataRect.get(i).selectFlag = true; } // применить условие на вершины по menuFlg - восстановить menuFlg // Log.e(TAG, "f_readData0 menuFlg = " + menuFlg); if (menuFlg == 0) { if (dbH.f_getMas("select distinct id_2 || ' ' as stext from temp_pe;") > 0) { // Log.e(TAG, "f_readData1 selectedMas = " + DbHelper.selectedMas[0] + " " + DbHelper.selectedMas.length); menuFlg = Integer.parseInt(DbHelper.selectedMas[0].trim()); } else menuFlg = 0; } // Log.e(TAG, "f_readData2 menuFlg = " + menuFlg); } private void f_setPos() { // установить xPos - точку на канвас в объектах точки dataSubs, должна выполняться после чтения данных и при поворотах осей // записывает точки в табл points без кодов цвета if (spaceKely.arayEtag.size() == 0) return; int i, sloev = spaceKely.arayEtag.size(), sloy = 0, sloy0 = -1, countPoint, nPoint = 0, urovIt = -1; // уровень по Z группы точек double hMin = -DbHelper.faktSubsLen - 0.5d, hMax = DbHelper.faktSubsLen - 0.5d; double hShag = 1d, radius, ugol = 0., ugol2 = 0.; double xyz[] = {0d, 0d, 0d}; // размещение точек по этажам int iMax = Integer.MIN_VALUE; // iMin=Integer.MAX_VALUE, for (i = 0; i < sloev; i++) { if (spaceKely.arayEtag.get(i) > iMax) iMax = spaceKely.arayEtag.get(i); // вычисляю мах iMax = максимум точек на слое // Log.e(TAG, "f_setPos sloy = " + i + " get(i)= "+ spaceKely.arayEtag.get(i) + " sloev= "+ sloev ); } if (sloev > 1) hShag = (hMax - hMin) / (sloev - 1f); // высота слоя для итерации final String sqLL[] = { "DELETE FROM points;", "UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='points';", "delete from temp_elements;", "UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='points';", "UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='temp_elements';" }; for (i = 0; i < sqLL.length; i++) db.execSQL(sqLL[i]); String sqlInsLine; for (int m = 0; m < valDataRect.size(); m++) { dataPoint dsb = valDataRect.get(m); sloy = dsb.nEtage; if (sloy != sloy0) { nPoint = 0; urovIt++; sloy0 = sloy; } countPoint = spaceKely.arayEtag.get(sloy); //число точек на уровне if (countPoint == 0) break; ugol = 2. * Math.PI / countPoint; if (countPoint % 2 == 0) ugol2 = ugol / 2.; else ugol2 = 0.; xyz[2] = hMin + urovIt * hShag; radius = f_getRadius(iMax, countPoint, nPoint); // 0.6 + 1.2 * countPoint / iMax; if (countPoint == 1) { // единица в центре xyz[0] = xyz[1] = 0.; } else { xyz[0] = radius * Math.cos(ugol * nPoint + ugol2); xyz[1] = radius * Math.sin(ugol * nPoint + ugol2); } float xx[] = spaceKely.f_setVector(xyz, 1); // точка на канвасе valDataRect.get(m).f_setXY( xx ); // точка на канвасе if (lineCreated == 0) { sqlInsLine = "insert into points (ind_point, id_element, npp, iteration, xp, yp, zp, point_num) VALUES (" + m + ", " + valDataRect.get(m).id + ", " + // npp = id G для автоморф (flagSn ? valDataRect.get(m).idSub : valDataRect.get(m).id) + ", " + sloy + ", " + xyz[0] + ", " + xyz[1] + ", " + xyz[2] + ", '" + nPoint + "');"; db.execSQL(sqlInsLine); // ошибок не должно быть ! } /* Log.e(TAG, "f_setPos sloy = " + sloy + " urovIt= "+ urovIt + " countPoint= "+ countPoint + " radius= "+ radius + " sloev= "+ sloev + " hShag = "+ hShag + " iMax = " + iMax + " hMin= "+ hMin + " hMax= "+ hMax) ; Log.e(TAG, "f_setPos m = " + m + " xyz= "+ xyz[0] + " "+ xyz[1] + " "+ xyz[2] + " "+ " xx = "+ xx[0] + " " + xx[1] + " valDataRect.get(m). = " + valDataRect.get(m).xPos[0] + " " + valDataRect.get(m).xPos[1] ); */ nPoint++; } } private float f_getRadius(int maxPoint, int count, int nTochki) { // выдает радиус точки на итерации final int pointsNaRadius = 40; float r = (float) (1.10d * DbHelper.faktSubsLen * count / maxPoint); if (count < pointsNaRadius) { // Log.e(TAG, "f_getRadius maxPoint=" + maxPoint + " countPoint="+count + " nTochki="+ nTochki + " r="+ r ); return r; } int m = count / pointsNaRadius; // число радиусов int n = 1 + nTochki % m; // номер радиуса r = (float) n * r / (float) m; // Log.e(TAG, "f_getRadius nTochki=" + nTochki + " countPoint="+count + " n="+ n + " m="+ m + " r="+ r ); return r; } private void f_raskraska() { /* 1. по kakKolop в таблице points установить kluch для кода цвета update points set kluch = ( select R.class_area || ' ' as kluch from elements" + mApp.tableNameEnd + " E, pairing_area" + mApp.tableNameEnd + " R where R.id_subs = E._id where points.id_element = E._id) 2. установить colorNum в valDataRect kakKolop = 1; // По итерациям kakKolop = 2; // По классам kakKolop = 3; // По цикл типу kakKolop = 4; // По P kakKolop = 5; // По порядку эл-та kakKolop = 6; // По Силову kakKolop = 7; // Четные и нечетные */ txtSoobColor = ""; txtSoobSelect = ""; txtSoobTouch = ""; String selStr = "", klch, klch0 = "U", tabName = flagSn ? "elements_n" : "elements" + mApp.tableNameEnd , parName = flagSn ? "pairing_area_n" : "pairing_area" + mApp.tableNameEnd, idName = flagSn ? "id_true" : "_id", // snPole = flagSn ? ", link_to_elements idgr" : ", null idgr", snWhere = flagSn ? " where for_n <= " + DbHelper.faktSubsLen + " and points.id_element = " : " where points.id_element = "; switch (kakKolop) { case 1: // По итерациям selStr = "update points set kluch = (\n" + "select iteration || ' ' as kluch from " + tabName + snWhere + idName + ");"; txtSoobColor = "Раскраска точек по итерациям"; break; case 2: // По классам selStr = "update points set kluch = (\n" + "select R.class_area || ' ' as kluch " + " from " + tabName + " E, " + parName + " R" + " where R.id_subs = E." + idName + (flagSn ? " and for_n <= " + DbHelper.faktSubsLen : " ") + " and points.id_element = E." + idName + ");"; txtSoobColor = "Раскраска точек по классам"; break; case 3: // По цикл типу selStr = "update points set kluch = (\n" + "select cykl_len as kluch from " + tabName + snWhere + idName + ");"; txtSoobColor = "Раскраска точек по цикл типу"; break; case 4: // По P selStr = "update points set kluch = (\n" + "select pe || ' ' as kluch from " + tabName + snWhere + idName + ");"; txtSoobColor = "Раскраска точек по Р"; break; case 5: // По порядку эл-та selStr = "update points set kluch = (\n" + "select deg || ' ' as kluch from " + tabName + snWhere + idName + "); "; txtSoobColor = "Раскраска точек по порядку эл-та"; break; case 6: // По Силову selStr = "update points set kluch = (\n" + "select sylow_num as kluch from " + tabName + snWhere + idName + ");"; txtSoobColor = "Раскраска точек по № подгруппы Силова "; break; case 7: // четные и нечетные selStr = "update points set kluch = (\n" + "select parity ||' ' as kluch from " + tabName + snWhere + idName + ");"; txtSoobColor = "Раскраска точек четные и нечетные"; break; case 8: // по стационарным точкам selStr = "update points set kluch = (\n" + "select stabilizer ||' ' as kluch from " + tabName + snWhere + idName + ");"; txtSoobColor = "Раскраска точек по стационарным точкам"; break; case 9: // по числу стационарных точек selStr = "update points set kluch = (\n" + "select length(stabilizer) ||' ' as kluch from " + tabName + snWhere + idName + ");"; txtSoobColor = "Раскраска точек по числу стационарных точек"; break; default: } f_putText(); if (DISPLAYLOG) Log.e(TAG, "f_raskraska " + DbHelper.faktSubsLen + " kakKolop = " + kakKolop + " txtSoobColor = " + txtSoobColor +" posCreated = " + posCreated + " flagSn = " + flagSn + " sql= " + selStr); db.execSQL(selStr); // ошибок не должно быть ! selStr = "select id_element, kluch, ind_point, E._id ll, E.deg deg from points P, elements" + mApp.tableNameEnd + " E" + " where id_element = E._id order by kluch asc; "; if (flagSn) selStr = "select id_element, kluch, ind_point, E.link_to_elements" + mApp.tableNameEnd + " ll, E.deg deg from points P, elements_n E" + " where id_element = E.id_true order by kluch asc; "; Cursor mCursor = db.rawQuery(selStr, null); if (mCursor.moveToFirst()) { int colorN = 0, indPt, id, ide, deg, ide_ = mCursor.getColumnIndex("ll"), deg_ = mCursor.getColumnIndex("deg"), id_ = mCursor.getColumnIndex("id_element"), ik_ = mCursor.getColumnIndex("kluch"), ig_ = mCursor.getColumnIndex("ind_point"); do { ide = mCursor.getInt(ide_); // для отладки deg = mCursor.getInt(deg_); // для отладки id = mCursor.getInt(id_); // ind_point indPt = mCursor.getInt(ig_); // ind_point klch = mCursor.getString(ik_); // ключ для раскраски if (klch == null) klch = " "; if ( ! klch.equals(klch0)) { colorN++; klch0 = klch; } valDataRect.get(indPt).f_setColor(colorN); if (DISPLAYLOG) Log.e(TAG, "f_raskraska id= " + id + " ==? id = " + valDataRect.get(indPt).id + " ide= "+ ide +" indPt= "+ indPt + " colorN = " + colorN + " klch = " + klch + " deg = " + deg); } while (mCursor.moveToNext()); } mCursor.close(); } } //-------------------------