public WaveformID GetWaveID() { Vector3 boundHalfSize = Bounds.LargerSize; WaveformID wave = new WaveformID(256); Vector3 normVec; foreach (Vertex v in Vertices) { normVec = new Vector3( ((v.Position.X / boundHalfSize.X) / 2 + 0.5f) * (wave.WaveWidth - 1), ((v.Position.Y / boundHalfSize.Y) / 2 + 0.5f) * (wave.WaveWidth - 1), ((v.Position.Z / boundHalfSize.Z) / 2 + 0.5f) * (wave.WaveWidth - 1)); int xStartIndex = (int)Math.Floor(normVec.X); int yStartIndex = (int)Math.Floor(normVec.Y); int zStartIndex = (int)Math.Floor(normVec.Z); float xStartBias = normVec.X - (float)Math.Floor(normVec.X); float yStartBias = normVec.Y - (float)Math.Floor(normVec.Y); float zStartBias = normVec.Z - (float)Math.Floor(normVec.Z); wave.XWave[xStartIndex] += xStartBias; wave.YWave[yStartIndex] += yStartBias; wave.ZWave[zStartIndex] += xStartBias; wave.XWave[xStartIndex + 1] += (1 - xStartBias); wave.YWave[yStartIndex + 1] += (1 - yStartBias); wave.ZWave[zStartIndex + 1] += (1 - zStartBias); } return(wave); }
private void checkIfSimilarToBtn_Click(object sender, EventArgs e) { if (currentlyLoadedModel == null) { MessageBox.Show("Please load a model first", "Embedded Data", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } StringBuilder filterStr = new StringBuilder(); string allFilter = "All Supported Formats|"; foreach (KeyValuePair <string, ModelInstantationHelper> kvp in modelImporters) { filterStr.Append("|" + kvp.Value.ModelInfo.TypeName + "|*." + kvp.Key); allFilter += "*." + kvp.Key + ";"; } allFilter = allFilter.Substring(0, allFilter.Length - 1); OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = allFilter + filterStr.ToString(); if (ofd.ShowDialog() != DialogResult.OK) { return; } ModelInstantationHelper mih = modelImporters[Path.GetExtension(ofd.FileName).Substring(1)]; Model imported = mih.ModelImporter.DoImportModel(ofd.FileName); if (imported == null) { return; } WaveformID wave = currentlyLoadedModel.GetWaveID(); WaveformID testWave = imported.GetWaveID(); double similarity = wave.CompareTo(testWave); string similarityString = "NOT Similar"; if (similarity == 0.0) { similarityString = "Identical"; } else if (similarity < 10.0) { similarityString = "Almost identical"; } else if (similarity < 500.0) { similarityString = "Very similar"; } else if (similarity < 1500.0) { similarityString = "Similar"; } MessageBox.Show("Models are " + similarityString + "\n\nDifference index = " + similarity); }
public double CompareTo(WaveformID other) { double differenceX = 0.0f; double differenceY = 0.0f; double differenceZ = 0.0f; for (int i = 0; i < XWave.Length; ++i) { differenceX += Math.Pow(Math.Abs(other.XWave[i] - XWave[i]), 2); differenceY += Math.Pow(Math.Abs(other.YWave[i] - YWave[i]), 2); differenceZ += Math.Pow(Math.Abs(other.ZWave[i] - ZWave[i]), 2); } double result = (differenceX + differenceY + differenceZ); return(double.IsNaN(result) ? 0 : result); }
private void loadModelBtn_Click(object sender, EventArgs e) { StringBuilder filterStr = new StringBuilder(); string allFilter = "All Supported Formats|"; foreach (KeyValuePair <string, ModelInstantationHelper> kvp in modelImporters) { filterStr.Append("|" + kvp.Value.ModelInfo.TypeName + "|*." + kvp.Key); allFilter += "*." + kvp.Key + ";"; } allFilter = allFilter.Substring(0, allFilter.Length - 1); OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = allFilter + filterStr.ToString(); if (ofd.ShowDialog() != DialogResult.OK) { return; } ModelInstantationHelper mih = modelImporters[Path.GetExtension(ofd.FileName).Substring(1)]; Model imported = mih.ModelImporter.DoImportModel(ofd.FileName); if (imported == null) { return; } if (currentlyLoadedModel != null) { currentlyLoadedModel.Dispose(); } WaveformID lastWave = currentlyLoadedModel != null?currentlyLoadedModel.GetWaveID() : null; currentlyLoadedModel = imported; propertyGrid.SelectedObject = new DictionaryPropertyGridAdapter(currentlyLoadedModel.Metadata); dmwglControl.UpdateMatrices(); WaveformID wave = currentlyLoadedModel.GetWaveID(); waveformChart.Series[0].Points.Clear(); waveformChart.Series[1].Points.Clear(); waveformChart.Series[2].Points.Clear(); for (int i = 0; i < wave.XWave.Length; ++i) { waveformChart.Series[0].Points.Add(wave.XWave[i]); waveformChart.Series[1].Points.Add(wave.YWave[i]); waveformChart.Series[2].Points.Add(wave.ZWave[i]); } if (lastWave != null) { double similarity = wave.CompareTo(lastWave); string similarityString = "NOT Similar"; if (similarity < 1.0) { similarityString = "Identical"; } else if (similarity < 10.0) { similarityString = "Almost identical"; } else if (similarity < 500.0) { similarityString = "Very similar"; } else if (similarity < 1500.0) { similarityString = "Similar"; } MessageBox.Show("Models are " + similarityString + "\n\nDifference index = " + similarity); } }