/
nea
/
androidGroupBuilder
Обзор
Документация
Войти
/
nea
/
androidGroupBuilder
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/src/main/java/com/ea/groupbuilder/classKely.java
362 строки
19 KB
ea
Группа Автоморфизмов отлажено 23_04_2026
23 апр 2026, 17:08
23 апр 2026, 17:08
4513276
Код
Авторство
О чём код?
package com.ea.groupbuilder; import static java.lang.Math.sqrt; import android.graphics.Canvas; import android.graphics.Paint; import android.opengl.Matrix; import android.util.Log; import java.util.ArrayList; import java.util.List; public class classKely extends classImages { // пункты меню выбора // используется в RnActivitySelect и в Кэли // static функции как f_setMasForSelect используются во всех графиках final static public String[] valuesTextForSelectInit = { // ModeActivityGrupp выдает тексты выбора раскраски вершин "Выделить коммутант", // 0 "Выделить центр", // 1 "Выделить цоколь", // 2 "Выделить образующие", // 3 "Выделить цикленный тип", // 4 "Выделить точки одной итерации", // 5 "Выделить класс сопряженных элементов ", // 6 "Выделить стабилизатор заданного i", // 7 "Выделить элементы одного порядка", // 8 "Выделить четные подстановки", // 9 "Выделить все P элементы", // 10 "Выделить все степени элемента", // 11 "Выделить нормальную подгруппу по номеру", // 12 "Выделить силовскую подгрупп по номеру", // 13 "Выделить общие силовские подгруппы для одного P", // 14 "Выделить общюю силовскую подгруппу по номерам" // 15 }; final static private String TAG = "GRUGRA_SPACE"; final static private boolean DISPLAYLOG = false; static public String[] valuesTextForSelect = {}; // RnActivitySelect выдает тексты выбор раскраски вершин public List<Integer> arayEtag = new ArrayList(); // чосло точек по этажам private final float[] work2Matrix = new float[16]; // рабочие матрицы private final float[] workMatrix = new float[16]; public float[] modelRotate = new float[16]; // добавленное вращение через Touch classKely( double povVec[], double ugol) { Matrix.setIdentityM(modelRotate, 0); Matrix.rotateM(modelRotate, 0, (float) -ugol, (float) povVec[0], (float) povVec[1], (float) povVec[2]); axisX = new double[2][3]; // матрица проектирования на D2 if (DISPLAYLOG) Log.d(TAG, "classSpaceN povVec[]= "+ povVec[0]+ " "+ povVec[1] + " "+ povVec[2]+ " ugol = " + ugol); } // функции выбора по меню public static void f_setMasForSelect(DbHelper dbh, boolean flagSn) { // устанавливает valuesTextForSelect для выбора по fab // используется в RnActivitySelect int j = 0; if ((flagSn ? substitutionS.sylovPrimeGrupNum_n : substitutionS.sylovPrimeGrupNum).size() == 0) { // содержат pe - сил подгрупп j = 12; // нет сил подгрупп } else { if (dbh.f_getCount("select count(*) as ccc from " + (flagSn ? "sylov_com_grup_n" : "sylov_com_grup" + mApp.tableNameEnd + "")) > 0) j = 16; else j = 14; // нет общ сил подгрупп } valuesTextForSelect = new String[j]; System.arraycopy(valuesTextForSelectInit, 0, valuesTextForSelect, 0, j); } public static String f_selectedItemPos(int jSelected, boolean flagSn) { // обработка выбора по fab меню - возвращает strSql - строка для dbH.f_getMas(strSql) // используется в RnActivitySelect String strSql = "", pref = (flagSn ? "_n" : mApp.tableNameEnd); switch (jSelected) { case 4: // Выделить цикленный тип strSql = "select distinct 'Цикл тип = ' || cykl_len || ' всего ' || count(distinct _id) || ' элементов ' as stext from elements" + pref + " where length(cykl_len) > 0 group by cykl_len order by 1 asc; "; break; case 5: // Выделить точки одной итерации if (mApp.tableNameEnd.equals("_a")) { strSql = "select distinct 'Итерация = ' || 0 || ' элементов ' || count(_id) as stext from elements; "; } else strSql = "select distinct 'Итерация = ' || ind || ' элементов ' || val as stext from params where parm = 'pointsPerIteration" + pref + "' order by 1 asc; "; break; case 6: // Выделить класс сопряженных элементов и одним цветом центр strSql = "select distinct 'Класс = ' || class_area as stext from pairing_area" + pref + " order by 1 asc; "; break; case 7: // Выделить стабилизатор заданного i strSql = "select distinct 'i = ' || stabilizer as stext from elements" + pref + " where length(stabilizer) > 0 order by 'i = ' || stabilizer;"; break; case 8: // Выделить элементы одного порядка strSql = "select distinct 'порядок = ' || deg ||' всего ' || count(distinct _id) || ' элементов ' as stext from elements" + pref + " group by deg order by 1 asc ;"; break; case 9: // Выделить четные подстановки strSql = "select distinct 'четность = ' || parity ||' всего ' || count(distinct _id) || ' элементов ' as stext from elements" + pref + " group by parity order by 1 asc;"; break; case 10: // Выделить все для одного P strSql = "select distinct 'PE = ' || pe ||' всего ' || count(distinct _id) || ' элементов ' as stext from elements" + pref + " where pe > 0 group by pe order by 1 asc ; "; break; case 11: // Выделить все степени эл-та strSql = "select distinct 'Id = ' || ()_id || ' степень = ' || deg || ' ' || name || ' ' || ciklos as stext from elements" + pref + " order by 1 asc;"; break; case 12: // Выделить нормальную подгрупп по номеру strSql = "select distinct '№ '|| num_maim as stext from sub_structure" + mApp.tableNameEnd + " order by 1 asc;"; break; case 13: // Выделить силовскую подгрупп по номеру strSql = "select distinct 'PE ' ||pe||' № = ' || num || ' элементов ' || count(distinct _id) || ' элементов ' as stext from sylov_table" + pref + " group by num order by 1 asc;"; break; case 14: // Выделить общие силовские подгруппы для одного P strSql = "select distinct ' PE = ' || pe as stext from sylov_com_grup" + pref + " order by 1 asc;"; break; case 15: // Выделить общюю силовскую подгруппу по номерам strSql = "select distinct 'PE ' || pe || ' № = ' || sylow_zag as stext from sylov_com_grup" + pref + " order by 1 asc;"; break; default: } return strSql; } public static String f_setInsetr(int jSelted, String numSel, boolean flagSn, DbHelper dbH) { // выводит строку для заполнения temp_pe при выборе в меню по fab // используется в RnActivitySelect int idL, idM; String insrtStr = "", pref = (flagSn ? "_n" : mApp.tableNameEnd), prfId = ( flagSn ? "id_true" : "_id"); switch (jSelted) { case 0: // Выделить коммутант insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select " + prfId + ", 0 from elements" + pref + " where switchboard_num > 0 order by 1 asc;"; break; case 1: // Выделить центр insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select " + prfId + ", 0 from elements" + pref + " where center_num = " + ( flagSn ? DbHelper.countElements_n : DbHelper.countElements) + " order by 1 asc;"; break; case 2: // Выделить цоколь insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select " + prfId + ", 0 from elements" + pref + " where length(nomer_soc) > 0 order by 1 asc;"; break; case 3: // "Выделить образующие", // 2a insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select " + prfId + ", 0 from elements" + pref + " where iteration = 0; order by 1 asc;"; break; case 4: // Выделить цикленный тип insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select " + prfId + ", 0 from elements" + pref + " where cykl_len = '" + numSel + "' order by 1 asc;"; break; case 5: // Выделить точки одной итерации insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select " + prfId + ", 0 from elements" + pref + " where iteration = " + numSel + " order by 1 asc;"; break; case 6: // Выделить класс сопряженных элементов insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select id_subs, 0 from pairing_area" + pref + " where class_area = " + numSel + " order by 1 asc;"; break; case 7: // Выделить стабилизатор заданных i insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select " + prfId + ", 0 from elements" + pref + " where instr(stabilizer, '" + numSel + "') > 0 or length(ciklos) = 0 order by 1 asc;"; break; case 8: // Выделить элементы одного порядка insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select " + prfId + ", 0 from elements" + pref + " where deg = " + numSel + " order by 1 asc;"; break; case 9: // Выделить четные подстановки insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select " + prfId + ", 0 from elements" + pref + " where parity = " + numSel + " order by 1 asc;"; break; case 10: // Выделить все для одного P insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select " + prfId + ", 0 from elements" + pref + " where pe = '" + numSel + "' or length(ciklos) = 0 order by 1 asc;"; break; case 11: // Выделить все степени элемента insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select distinct _id, 0 from elements" + pref + " where _id in(" + numSel; idL = Integer.parseInt(numSel.trim()); do { idM = dbH.f_getCount("select idproiz as ccc from temp_multiplication " + pref + " where idleft = " + idL + " and idright = " + numSel + ";"); insrtStr += ", " + idM; // Log.e(TAG, "f_setInsetr Выделить все степени элемента id= " + numSel + " " +idM ); if (idM == (flagSn ? substitutionS.codEdinicy_n : substitutionS.codEdinicy)) break; idL = idM; // CREATE TABLE temp_multiplication (_id INTEGER primary key autoincrement, idproiz INTEGER, idleft INTEGER NOT NULL, idright INTEGER NOT NULL, name TEXT, name_old TEXT, txt TEXT NOT NULL,iteration INTEGER, deg INTEGER ) } while (true); insrtStr += ");"; break; case 12: // Выделить нормальную подгруппу подгрупп по номеру insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select distinct P.id_subs as _id, 0 \n" + " from pairing_area" + mApp.tableNameEnd + " P, sub_structure" + mApp.tableNameEnd + " S, elements" + mApp.tableNameEnd + " E\n" + " where S.num_subs = P.class_area and E._id = P.id_subs and \n" + " S.num_maim = " + numSel; break; case 13: // Выделить силовскую подгрупп по номеру insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select id_s, 0 from sylov_table" + pref + " where num = " + numSel + " order by 1 asc;"; break; case 14: // Выделить общиx силовских подгрупп insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select distinct id_s, 0 from sylov_com_grup" + pref + " where pe = " + numSel + " order by 1 asc;"; break; case 15: // Выделить общюю силовскую подгруппу по номеру insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select distinct id_s, 0 from sylov_com_grup" + pref + " where sylow_zag = '" + numSel + "' order by 1 asc;"; break; case 16: // Выделение распавшихся классов (из ) insrtStr = "insert into temp_pe (id_1, id_2) \n" + " select id_subs, 0 from pairing_area" + pref + " A where A.cykl_len in (\n" + " select cykl_len from (\n" + " select count(distinct P.class_area) as pairing_num, P.cykl_len as cykl_len\n" + " from pairing_area" + pref + " P\n" + "\t\t GROUP by P.cykl_len\n" + "\t HAVING pairing_num > 1\n" + " order by P.cykl_len asc, pairing_num asc\n" + " ));" ; break; default: } if (DISPLAYLOG) Log.e(TAG, "f_setInsetr jSelted = " + jSelted + " numSel = " + numSel + " flagSn= " + flagSn + " insrtStr = " + insrtStr); return insrtStr; } public void f_TouchMove( double xs, double ys, double xt, double yt, float xdpi, float ydpi) { // устанавливает modelRotate final float h2 = 25.f / (xdpi + ydpi); final double dl = Math.sqrt((xt-xs)*(xt-xs) + (yt-ys)*(yt-ys)); if (dl == 0.d) return; final double ox = (ys-yt) / dl, oz = 0d, oy = (xs-xt) / dl; // перпендикуляр к плоскости, в которой идет вращение final double ug = 3. * Math.atan(dl * h2); // (renderer.near)); // / Math.PI; // if (DISPLAYLOG) // Log.d(TAG, "f_TouchMove xt,yt= "+ xt+ " "+ yt + " xs="+xs+" " + ys+" x1="+x1 + " "+ y1 + " "+ z1 + " ug="+ ug+ " xdpi="+xdpi+ " h2="+h2 + " dl="+dl); Matrix.setIdentityM(work2Matrix, 0); Matrix.rotateM(work2Matrix, 0, (float) ug, (float) ox, (float) oy, (float) oz); System.arraycopy(modelRotate, 0, workMatrix, 0, 16 ); Matrix.multiplyMM(modelRotate, 0, work2Matrix, 0, workMatrix, 0); if (DISPLAYLOG) for (int j = 0; j < 16; j++) { Log.e(TAG, "f_TouchMove work2Matrix[j] j= " + j + " " + work2Matrix[j]) ; } } public void f_setAxes() { // устанавливает матрицу поворота по modelRotate int j, k; double w, wl; // длина; if (DISPLAYLOG) { for (j = 0; j < 16; j++) { Log.e(TAG, "f_setAxes modelRotate[j] j= " + j + " " + modelRotate[j]); } } for (k = 0; k < 2; k++) {// первые 3 оси for (j = 0; j < 3; j++) axisX[k][j] = modelRotate[4 * k + j]; // 3D } // Нормирую for (k = 0; k < 2; k++) { wl = 0.; for (j = 0; j < 3; j++) wl += axisX[k][j] * axisX[k][j]; w = sqrt(wl); for (j = 0; j < 3; j++) axisX[k][j] /= w; } if (DISPLAYLOG) for (j = 0; j < 3; j++) { Log.e(TAG, "f_setAxes axisX[0][j] j= " + j + " " + axisX[0][j]) ; Log.e(TAG, "f_setAxes axisX[1][j] j= " + j + " " + axisX[1][j] ); } } // private int nnn = 0; public float[] f_setVector(double [] xyz, int kak) { // по подстановке sub вычисляет координаты точки на канвасе // kak = 0 - вывод точек как есть: (1, 2, 3) -> x=1, y=2, z=3 // kak = 1 - вывод точек -1: (1, 2, 3) -> x=0, y=1, z=2 int j, k; float vec0[] = {0f, 0f}; for (k = 0; k < 2; k++) { for (j = 0; j < 3; j++) { vec0[k] += (double) (xyz[j] - (kak == 0 ? 0. : 1.)) * axisX[k][j]; } } for (k = 0; k < 2; k++) { vec0[k] *= koeffX[k]; vec0[k] += dx[k]; } /* if (nnn < 20) Log.e(TAG, "f_setVector xyz = " + xyz[0] + " " + xyz[1] + " " + xyz[2] // + " " + sub[3] // + " " + sub[4] + " vec0 = " + vec0[0] + " " + vec0[1] + " kak = " + kak); nnn += 1; */ return vec0; } public void f_putAxes(Canvas canvas, Paint paint, float startX, float startY) { // вывод осей на canvas double os0[] = {0d, 0d, 0d}, os1[] = new double[3]; int k; float v0[] = f_setVector(os0, 0); for (k = 0; k < 3; k++) { // выводит базисные векторы os1[k] = 1d; float v1[] = f_setVector(os1, 0); canvas.drawLine(v0[0] + startX, v0[1] + startY, v1[0] + startX, v1[1] + startY, paint); canvas.drawText(" " + k, v1[0] + startX, v1[1] + startY, paint); if (DISPLAYLOG) Log.e(TAG, "f_putAxes k = " + k + " os1 = " + os1[0] + " " + os1[1] + " " + os1[2] + " v0 = " + v0[0] + " " + v0[1] + " " + " v1 = " + v1[0] + " " + v1[1]); os1[k] = 0; } } } //=======================