//格子番号から正規化された点を取得 public LDPoint getNormalizedPoint(int row, int col) { LDPoint p = new LDPoint(); p.setX(1.0f / getColumn() * row); p.setY(1.0f / getRow() * col); return(p); }
/// <summary> /// TODO: LDPoint注意 /// </summary> /// <param name="pt"></param> /// <param name="clip"></param> /// <returns></returns> public LDPoint inverseTransform(LDPoint pt, bool clip = false) { if (getColumn() == 0 && getRow() == 0) { //メッシュがない場合はそのままの値を返す return(pt); } double x = pt.x(); double y = pt.y(); //Gridからマッピング先のQuadを見つける LDPoint index = getMapedQuadIndex(new LDPoint((float)x, (float)y)); int col = (int)index.x(); int row = (int)index.y(); if (clip) { //Grid内にClipする。QuadをClipして変換するのではない col = LDMathUtil.clamp(col, 0, getColumn()); row = LDMathUtil.clamp(row, 0, getRow()); } LDPoint local = new LDPoint(); if (isOutside(row, col)) { LDQuadTransform quad = createOutsideQuadTransform(row, col); return(quad.inverseTransform(pt, clip)); //TODO:到達しない場所あります local = quad.inverseTransform(pt, clip); LDPoint _internal; _internal.setX((col + 1) * (1.0f / (getColumn() + 2)) + local.x() / (getColumn() + 2)); _internal.setY((row + 1) * (1.0f / (getRow() + 2)) + local.y() / (getRow() + 2)); LDQuadTransform tmp = new LDQuadTransform(new LDPoint(-1, -1), new LDPoint(getColumn() + 1, getRow() + 1)); return(tmp.transform(_internal)); } else { LDQuadTransform quad = getQuadTransform(row, col); local = quad.inverseTransform(pt, clip); LDPoint _internal = new LDPoint(); _internal.setX(col * (1.0f / getColumn()) + local.x() / getColumn()); _internal.setY(row * (1.0f / getRow()) + local.y() / getRow()); return(_internal); } }
//Gridの内分率からQuadのローカルな内分率を取得する public LDPoint getLocalPoint(LDPoint t) { double tx = t.x(); double ty = t.y(); LDPoint localT = new LDPoint(); if (tx == 0) { localT.setX(0); } else if (tx == 1) { localT.setX(1); } else { double scaled = tx * getColumn(); //小数部を求める localT.setX((float)scaled - (int)Math.Truncate(scaled)); } if (ty == 0) { localT.setY(0); } else if (ty == 1) { localT.setY(1); } else { double scaled = ty * getRow(); //小数部を求める localT.setY((float)scaled - (int)Math.Truncate(scaled)); } return(localT); }
/// <summary> /// TODO: LDPoint注意 /// </summary> /// <param name="pt"></param> /// <param name="clip"></param> /// <returns></returns> public LDPoint inverseTransform(LDPoint pt, bool clip = false) { if (getColumn() == 0 && getRow() == 0) { //メッシュがない場合はそのままの値を返す return pt; } double x = pt.x(); double y = pt.y(); //Gridからマッピング先のQuadを見つける LDPoint index = getMapedQuadIndex(new LDPoint((float)x, (float)y)); int col = (int)index.x(); int row = (int)index.y(); if (clip) { //Grid内にClipする。QuadをClipして変換するのではない col = LDMathUtil.clamp(col, 0, getColumn()); row = LDMathUtil.clamp(row, 0, getRow()); } LDPoint local = new LDPoint(); if (isOutside(row, col)) { LDQuadTransform quad = createOutsideQuadTransform(row, col); return quad.inverseTransform(pt, clip); //TODO:到達しない場所あります local = quad.inverseTransform(pt, clip); LDPoint _internal=new LDPoint(); _internal.setX((col + 1) * (1.0f / (getColumn() + 2)) + local.x() / (getColumn() + 2)); _internal.setY((row + 1) * (1.0f / (getRow() + 2)) + local.y() / (getRow() + 2)); LDQuadTransform tmp = new LDQuadTransform(new LDPoint(-1, -1), new LDPoint(getColumn() + 1, getRow() + 1)); return tmp.transform(_internal); } else { LDQuadTransform quad = getQuadTransform(row, col); local = quad.inverseTransform(pt, clip); LDPoint _internal = new LDPoint(); _internal.setX(col * (1.0f / getColumn()) + local.x() / getColumn()); _internal.setY(row * (1.0f / getRow()) + local.y() / getRow()); return _internal; } }
//格子番号から正規化された点を取得 public LDPoint getNormalizedPoint(int row, int col) { LDPoint p=new LDPoint(); p.setX(1.0f / getColumn() * row); p.setY(1.0f / getRow() * col); return p; }
//Gridの内分率からQuadのローカルな内分率を取得する public LDPoint getLocalPoint(LDPoint t) { double tx = t.x(); double ty = t.y(); LDPoint localT = new LDPoint(); if (tx == 0) { localT.setX(0); } else if (tx == 1) { localT.setX(1); } else { double scaled = tx * getColumn(); //小数部を求める localT.setX((float)scaled - (int)Math.Truncate(scaled)); } if (ty == 0) { localT.setY(0); } else if (ty == 1) { localT.setY(1); } else { double scaled = ty * getRow(); //小数部を求める localT.setY((float)scaled - (int)Math.Truncate(scaled)); } return localT; }